【问题标题】:Rhino Mocks - Do we really need stubs? [closed]Rhino Mocks - 我们真的需要存根吗? [关闭]
【发布时间】:2012-09-10 21:07:00
【问题描述】:

如果可以使用 mock.Stub().Return() 更改 Rhino Mocks 中的模拟行为,为什么我们还需要 Stub?

总是使用 MockRepository.GenerateMock() 我们会失去什么?

使用 Mocks 而不是 Stubs 的一大好处是,我们将能够在所有测试中重用相同的实例,从而使它们更加简洁明了。

起订量框架以类似的方式工作......我们没有用于模拟和存根的不同对象。

(请不要回答 Fowler 的“Mocks are not stubs”文章的链接)

【问题讨论】:

    标签: c# unit-testing mocking tdd rhino-mocks


    【解决方案1】:

    请记住,Rhino 已不再开发1。较新的框架完全放弃了这种模拟存根差异,并为其测试替身引入了单一术语:

    模拟框架的发展似乎向“一个通用实体”方向发展,而不是根据测试用例上下文有单独的不同实体。

    要详细了解这种分离(mock、stub、fake)是如何产生的以及它的用途,我建议阅读Mark Seemann's 关于continuum of test doubles 的文章:

    在一个极端,您会发现完全没有实现的假人,而在另一端则是完整的生产实现。傻瓜和生产实现都是明确定义的,但存根、间谍和伪造品更难确定:测试间谍什么时候变成伪造品?此外,模拟在连续体中占据相当大的间隔,因为它们在某些情况下可能非常复杂,但在其他情况下却非常简单。


    Rhino 似乎不区分 mock 和 stub,但还是有细微差别的。例如,考虑存根属性 getter:

    var mock = MockRepository.GenerateMock<IService>();
    mock.Stub(m => m.Property).Return(42);
    

    这是模拟对象时必须执行的操作。另一方面,Stub 引入了属性语义,它使整个事情变得琐碎:

    var stub = MockRepository.GenerateStub<IService>();
    stub.Property = 42;
    

    尽管这是我此刻唯一想到的,但可能还有更多。但是,这些只是细微的差别。

    1:截至 05/19/2013,这可能不再适用:Rhino Mocks new home

    【讨论】:

    • 我在一些项目中使用了起订量,我很喜欢!但是现在我正在做一个使用 Rhino 的项目......所以,我试图理解为什么我们不能忘记存根并在这个框架中使用 Mock 来实现这两个目的,就像我们对 moq 所做的那样。
    • 顺便说一句,感谢分享文章...我会看看!
    • @MarceloOliveira:我很确定如果 Rhino 被开发出来,我们不会有两种不同的类型。总的来说,你是对的,存根和模拟之间没有太大区别。但是,一些(虽然很小)。例如,请参阅我的更新答案。
    • 很好,但这仅在您使用接口使用 setter 对属性进行存根时才有效。如果您在 Rhino 中使用存根使用私有设置器存根属性,您将失败。出于某种神奇的原因(或错误),使用私有 setter 存根属性的唯一可能方法是使用 Mock (!!!)。
    【解决方案2】:

    有一个很明确的答案in the documentation

    模拟是一个我们可以设置期望的对象,它将 验证预期的动作确实发生了。存根是一个 您用来传递给被测代码的对象。你可以 设定对它的期望,所以它会以某些方式行动,但是那些 期望永远不会得到验证。存根的属性将 自动表现得像普通属性,你不能设置 对他们的期望。

    如果您想验证被测代码的行为,您将 使用具有适当期望的模拟,并验证这一点。如果你 只想传递一个可能需要以某种方式执行的值,但是 不是本次测试的重点,您将使用存根。

    重要提示:存根永远不会导致测试失败。

    【讨论】:

    • 这是存根与模拟的概念,但正如我在问题中所说,您可以将模拟用作 Rhino 的存根。那么,回到我的问题,拥有两个单独的对象有什么好处?总是使用 MockRepository.GenerateMock() 我们会失去什么?
    • 是的,您可以使用模拟作为存根。但是,如上所述,如果您不希望模拟影响测试结果,请使用存根。
    • 你能解释一下为什么吗?展示一些代码来证明你的论点怎么样?
    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多