如果我能够在Stub上调用AssertWasCalled方法,那么mock和stub之间有什么区别?

时间:2011-12-22 10:45:06

标签: c# .net unit-testing tdd rhino-mocks

据我所知,Stub只是依赖的替代品。 Stub不用于验证,它不能通过测试 - 来自单元测试的艺术。

但是自从Rhino Mocks 3.5以来,我可以做到这一点:

var service = MockRepository.GenerateStub<ILuckyService>(); 
service.AssertWasCalled(s=>s.GetLuckyNumberOfTheDay());

如果可以验证是否在存根上调用了某个方法,那么如果我需要使用存根或模拟,为什么还要打扰自己呢?

5 个答案:

答案 0 :(得分:3)

使用Martin Fowler的文章作为团队中的共享参考。这种区别对于测试的读者来说非常重要:当我看到存根时,我会忽略它并继续前进。

  • 存根就是让你的测试工作(NOP方法/返回一些固定值)。它不是测试的焦点,而是偶然的细节。 (虽然是测试场景的强制性细节/依赖性)
  • 另一方面,模拟是你的主要焦点...你想测试你的行为是否导致(模拟的)依赖关系满足特定的期望。

这是我的看法。即使Rhino Mocks允许你这样做,我也不会在Stub上断言。

答案 1 :(得分:1)

实际上,RhionMocks中Mock和Stub类的行为是相同的,可能会令人困惑,even to the creator of RhinoMocks
但是,由于stub and mock之间存在一个有趣的区别,因此使用Rhino Mocks选择一个,使您的代码意图更清晰。
创建存根时,您不希望测试在存根的方法调用上失败(例如,当您使用某个Log对象时)。
创建模拟时,您需要验证您的代码是否按预期使用了提供的对象(例如,将正确的数据写入数据库)。

答案 2 :(得分:1)

我总是尝试使用Stubs。 Stubs和Mocks之间的区别(从RM的角度来看)是stub在调用期间永远不会抛出异常。如果使用除预期之外的其他参数进行调用,Mocks(尤其是Strict)将立即抛出。此外,您可以验证仅对模拟而非存根的期望。

另一个困境是使用什么:Expect.Call()SetupResult.For()(我倾向于使用后者)。 但我同意所有这些丰富性在大多数情况下都是无用的。这就是为什么我更喜欢Stubs。

但是我建议你看一下Nsubstitute - 它没有那么多乱,并且语法非常有表现力。只需看看几个例子,你就会立即开始喜欢它:)

答案 3 :(得分:0)

答案 4 :(得分:0)

Stub或Mock是概念。您可以创建存根并将其用作模拟,反之亦然。我强烈建议您阅读这篇文章 - http://martinfowler.com/articles/mocksArentStubs.html