我的观察是否正确:
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;
如果我是对的;原因何在?
答案 0 :(得分:1)
简短的回答是,您可以设置mock.IsOK
以通过设置期望值并提供返回值来返回true:
var mock= MockRepository.GenerateMock<IMyInterface>();
mock.Expect(x => x.IsOK).Return(true);
当然,要了解原因,有助于理解模拟和存根之间的区别。马丁福勒在this article做得比我做得更好。
基本上,存根旨在用于提供虚拟值,在这种意义上,Rhino.Mocks允许您非常轻松地安排您想要的虚拟值:
stub.IsOK = true;
另一方面,Mocks旨在通过允许您为方法设置期望来帮助您测试行为。在这种情况下,Rhino.Mocks允许您使用以下语法排列您的期望:
mock.Expect(x => x.IsOK).Return(true);
因为Mock和Stub有两个不同的用途,所以它们的实现完全不同。
对于你的模拟例子:
var mock= MockRepository.GenerateMock<IMyInterface>();
mock.IsOK = true;
如果模拟器上的IsOK
setter的实现为空或完全忽略了您的调用,我不会感到惊讶。
答案 1 :(得分:0)
您尚未为模拟指定它应存储值并返回该值,因此它只返回bool
的默认值。我说行为不同的原因是因为在使用,意图和行为方面,模拟和存根之间存在隐含的差异。
对模拟,存根和假货之间的差异进行一些阅读。不是每个人同意一个答案,但你会发现它已达成普遍共识。从这里开始可能有所帮助:What's the difference between faking, mocking, and stubbing?