据我所知,Stub只是依赖的替代品。 Stub不用于验证,它不能通过测试 - 来自单元测试的艺术。
但是自从Rhino Mocks 3.5以来,我可以做到这一点:
var service = MockRepository.GenerateStub<ILuckyService>();
service.AssertWasCalled(s=>s.GetLuckyNumberOfTheDay());
如果可以验证是否在存根上调用了某个方法,那么如果我需要使用存根或模拟,为什么还要打扰自己呢?
答案 0 :(得分:3)
使用Martin Fowler的文章作为团队中的共享参考。这种区别对于测试的读者来说非常重要:当我看到存根时,我会忽略它并继续前进。
这是我的看法。即使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