使用'传统'记录/重放与Moq模型进行模拟

时间:2009-03-16 13:50:07

标签: unit-testing mocking moq

我是嘲笑的新手,并决定使用模拟框架。 Moq home引号

  

目前,这是唯一的嘲弄   反对的图书馆   一般而且有点不直观   (特别是对于新手)记录/回复   来自所有其他框架的方法。

任何人都能解释一下Record / Replay方法是什么以及Moq有何不同之处?从决定框架的角度来看,每个人的利弊是什么?

感谢。

3 个答案:

答案 0 :(得分:7)

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阶段。

此代码的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);

你可以看到哪个更好看。我曾经使用RhinoMocks但是因为我发现Moq我只使用Moq。我发现它可以生成更易读的代码。所以我的建议是去Moq。

答案 1 :(得分:1)

RhinoMocks实际上非常通用,你可以使用任何一种方法。在期望/验证风格下,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++); 

答案 2 :(得分:0)

我已经离开了Record / Replay,因为它很难在设置中看到什么是存根/模拟或只是运行代码。我相信Rhino有多种工作方式。特别是,您可以使用using()块将设置与其他呼叫隔离开来。