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

本文关键字:设置 返回值 是否 Mock 对象 | 更新日期: 2023-09-27 18:10:47

我的观察是否正确:

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;

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

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

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

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

当然,要理解其中的原因,首先要理解模拟和存根之间的区别。Martin Fowler这篇文章写得比我好。

基本上,存根是用来提供虚拟值的,从这个意义上讲,Rhino。mock允许您非常容易地安排您想要的虚拟值:

stub.IsOK = true;
另一方面,

mock的目的是通过允许您设置对方法的期望来帮助您测试行为。在这个例子中是犀牛。Mocks允许您使用以下语法安排您的期望:

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

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

在Mock示例中:

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

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

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

对mock、stub和fake之间的差异有一点了解。不是每个人都同意一个答案,但你会看到有一个普遍的共识。从这里开始可能会有所帮助:假装、嘲笑和存根之间的区别是什么?