我是否只需要在Mock对象上显式设置预期的返回值?

时间:2011-10-10 13:09:20

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

我的观察是否正确:

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;

如果我是对的;原因何在?

2 个答案:

答案 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?