10

我是模拟新手,正在决定一个模拟框架。起订量家庭报价

目前,它是唯一一个与所有其他框架的通用且有些不直观(尤其是对于新手)记录/回复方法背道而驰的模拟库。

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

谢谢。

4

3 回答 3

7

RhinoMocks支持 Record/Replay 方法。基本思想是你的测试执行分为两个阶段,记录阶段和回放阶段。更具体一点

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。我发现它会产生更具可读性的代码。所以我的建议是选择最小起订量。

于 2009-03-16T14:45:53.937 回答
1

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++); 
于 2011-03-30T12:12:51.903 回答
0

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

于 2009-05-21T17:06:01.723 回答