【问题标题】:Do I need to explicitly set expected return values on Mock object only?我是否只需要在 Mock 对象上显式设置预期返回值?
【发布时间】:2011-10-10 13:09:20
【问题描述】:

我的观察是否正确:

public intercafe IMyInterface { bool IsOK {get;set;} }

// If I use stub this always return true:
var stub = MockRepository.GenerateStub<IMyInterface>();
stub.IsOK = true;

// But if I use MOCK this always return false -NOT True
var mock= MockRepository.GenerateMock<IMyInterface>();
mock.IsOK = true;

如果我是对的;是什么原因?

【问题讨论】:

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


    【解决方案1】:

    简短的回答是,您可以设置mock.IsOK 以通过对其设置期望并提供返回值来返回 true:

    var mock= MockRepository.GenerateMock<IMyInterface>();
    mock.Expect(x => x.IsOK).Return(true);
    

    当然,要了解原因,了解模拟和存根之间的区别会有所帮助。 Martin Fowler 在this article 的工作比我做得更好。

    基本上,存根旨在用于提供虚拟值,从这个意义上说,Rhino.Mocks 允许您非常轻松地安排您想要的虚拟值:

    stub.IsOK = true;
    

    另一方面,Mocks 旨在通过允许您设置对方法的期望来帮助您测试行为。在这种情况下,Rhino.Mocks 允许您使用以下语法来安排您的期望:

    mock.Expect(x => x.IsOK).Return(true);
    

    因为 Mock 和 Stub 服务于两个不同的目的,所以它们具有完全不同的实现。

    在您的 Mock 示例中:

    var mock= MockRepository.GenerateMock<IMyInterface>();
    mock.IsOK = true;
    

    如果您的模拟上的 IsOK 设置器的实现为空或完全忽略您的调用,我不会感到惊讶。

    【讨论】:

      【解决方案2】:

      您没有为模拟指定它应该存储值并返回该值,因此它只是返回bool 的默认值。我想说行为差异的原因是因为在使用、意图和行为方面,模拟和存根之间存在隐含的差异。

      对 mock、stub 和 fake 之间的区别进行一些阅读。不是每个人都同意一个答案,但你会看到有一个普遍的共识。从这里开始可能会有所帮助:What's the difference between faking, mocking, and stubbing?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多