【问题标题】:Mocking using 'traditional' Record/Replay vs Moq model使用“传统”记录/重播与最小起订量模型进行模拟
【发布时间】:2010-10-13 14:58:47
【问题描述】:

我是 mocks 新手,正在决定一个 mock 框架。 Moq home 引号

目前,它是唯一的嘲弄 反对的图书馆 笼统的,有点不直观 (尤其是新手)记录/回复 所有其他框架的方法。

谁能简单地解释一下什么是记录/重放方法以及起订量有何不同?尤其是从决定框架的角度来看,它们各自的优缺点是什么?

谢谢。

【问题讨论】:

    标签: unit-testing mocking moq


    【解决方案1】:

    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);
          });
    

    所以 Expecting 块是 Record 阶段,Verify 块是 Replay 阶段。

    此代码的最小起订量变体是

    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);
    

    如您所见,阅读起来要好得多。我曾经使用 RhinoMocks,但自从我发现 Moq 我只使用 Moq。我发现它会产生更具可读性的代码。所以我的建议是选择起订量。

    【讨论】:

    • 这个答案对我来说没有多大意义。当然,Moq 变体更简单,但您仍然在测试中拥有这两个阶段:第 2 行(调用“Expect”)属于“记录”阶段,而第 3 行和第 4 行属于“重播”阶段.我不认为仅仅语法上的差异对于“记录/重放”模型是必不可少的。
    【解决方案2】:

    RhinoMocks 实际上用途广泛,您可以使用任何一种方法。 RhinoMocks 在 expect/verify 样式下看起来比 Moq 好一点。然而,即使你可以使用这种风格的事实也隐藏在文档中(我上次查看)。在我当前的项目中,我们选择 Moq 而不是 RhinoMocks,因为我们没有意识到它会设置/验证。

    记录/重放语法确实使您能够更改方法将在随后调用该方法时返回的值。这有时很有用。话虽如此,这样做的需要通常是您的设计不太正确的气味。但是,当您可以清楚地看到问题所在并且您必须继续前进时,它很有用。

    起订量确实可以更改值,但有点笨拙(来自文档)

    // returning different values on each invocation 
    var mock = new Mock<IFoo>(); 
    var calls = 0; 
    mock.Setup(foo => foo.GetCountThing())
    .Returns(() => calls)
    .Callback(() => calls++); 
    

    【讨论】:

      【解决方案3】:

      我已经关闭了记录/重播,因为它很难在设置中查看存根/模拟的内容或正在运行的代码。我相信 Rhino 有多种工作方式。特别是,您可以使用 using() 块将 setup 与其他调用隔离开来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多