我是嘲笑的新手,并决定使用模拟框架。 Moq home引号
目前,这是唯一的嘲弄 反对的图书馆 一般而且有点不直观 (特别是对于新手)记录/回复 来自所有其他框架的方法。
任何人都能解释一下Record / Replay方法是什么以及Moq有何不同之处?从决定框架的角度来看,每个人的利弊是什么?
感谢。
答案 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()
块将设置与其他呼叫隔离开来。