代码之家  ›  专栏  ›  技术社区  ›  Fung

使用“传统”记录/重播与MoQ模型模拟

  •  9
  • Fung  · 技术社区  · 17 年前

    我刚开始模拟,正在决定一个模拟框架。这个 Moq home 引用

    目前,这是唯一的嘲弄 图书馆反对 广义的,有点非理论性的 (尤其是新手)记录/回复 所有其他框架的方法。

    有人能简单地解释一下什么是记录/重放方法,以及最小订货量有什么不同吗?每种方法的优缺点是什么,特别是从确定框架的角度来看?

    谢谢。

    3 回复  |  直到 12 年前
        1
  •  7
  •   Donal Lafferty    12 年前

    记录/重播方法支持 RhinoMocks . 基本思想是将测试执行分为两个阶段,即记录阶段和重播阶段。更具体一点

    var repo = new MockRepository();
    var dependency = repo.DynamicMock<IDependency>();
    With.Mocks(repo).Expecting(delegate {
             Expect.Call(dependency.AMethod(1)).Return(result);                    
          }).Verify(delegate {
             var sut = new Sut(wrappee);
             sut.DoStuffThatCallsAMethod();
             Assert.IsTrue(sut.ResultState);
          });
    

    所以期望块是记录阶段,验证块是重放阶段。

    此代码的moq变量为

    var dependency = new Mock<IDependency>();
    dependency.Expect(dep => dep.AMethod(1)).Returns(result);          
    var sut = new Sut(wrappee.Object);
    sut.DoStuffThatCallsAMethod();
    Assert.IsTrue(sut.ResultState);
    

    正如你所看到的,这本书更适合阅读。我以前用过犀牛模型,但自从我发现了莫克后,我只使用莫克。我发现它可以产生更可读的代码。所以我的建议是去参加最低限价。

        2
  •  1
  •   Ed Sykes    15 年前

    犀牛模型实际上是非常通用的,你可以使用任何一种方法。在Expect/Verify样式下,Rhinomocks看起来比MoQ好一点。但是,即使您可以使用这种样式的事实也隐藏在文档中(上次我查看时)。在我目前的项目中,我们选择了MoQ而不是Rhinomocks,因为我们没有意识到它可以进行设置/验证。

    记录/重播语法确实使您能够更改方法在随后调用该方法时返回的值。这有时是有用的。尽管如此,这样做的必要性往往是你的设计不太正确的味道。不过,当你能很清楚地看到问题所在,你必须继续前进时,这是很有用的。

    MOQ确实有能力改变价值,但它有点笨拙(从文档中)

    // returning different values on each invocation 
    var mock = new Mock<IFoo>(); 
    var calls = 0; 
    mock.Setup(foo => foo.GetCountThing())
    .Returns(() => calls)
    .Callback(() => calls++); 
    
        3
  •  0
  •   Steve Freeman    17 年前

    我已经离开了录音/重播,因为这使得很难在设置中看到什么是存根/模拟或只是运行代码。我相信犀牛有多种工作方式。特别是,您可以使用 using() 阻止以将安装程序与其他调用隔离。