【问题标题】: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 设置器的实现为空或完全忽略您的调用,我不会感到惊讶。