【发布时间】:2010-10-13 14:58:47
【问题描述】:
我是 mocks 新手,正在决定一个 mock 框架。 Moq home 引号
目前,它是唯一的嘲弄 反对的图书馆 笼统的,有点不直观 (尤其是新手)记录/回复 所有其他框架的方法。
谁能简单地解释一下什么是记录/重放方法以及起订量有何不同?尤其是从决定框架的角度来看,它们各自的优缺点是什么?
谢谢。
【问题讨论】:
标签: unit-testing mocking moq
我是 mocks 新手,正在决定一个 mock 框架。 Moq home 引号
目前,它是唯一的嘲弄 反对的图书馆 笼统的,有点不直观 (尤其是新手)记录/回复 所有其他框架的方法。
谁能简单地解释一下什么是记录/重放方法以及起订量有何不同?尤其是从决定框架的角度来看,它们各自的优缺点是什么?
谢谢。
【问题讨论】:
标签: unit-testing mocking moq
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。我发现它会产生更具可读性的代码。所以我的建议是选择起订量。
【讨论】:
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++);
【讨论】:
我已经关闭了记录/重播,因为它很难在设置中查看存根/模拟的内容或正在运行的代码。我相信 Rhino 有多种工作方式。特别是,您可以使用 using() 块将 setup 与其他调用隔离开来。
【讨论】: