Rhino Mocks模拟继承的接口

时间:2009-10-01 17:34:51

标签: rhino-mocks partial-mocks

我有一个班级,例如从基类继承的DerivedClass,例如BaseClass的。 BaseClass实现了一个名为IBaseClass的接口。 IBaseClass有一个名为TestProperty的属性,它是一个整数自动属性。

我的PartialMultiMock DerivedClass如下:

derivedClassMock = repository.PartialMultiMock<DerivedClass>(typeof(IBaseInterface));

然后我按如下方式设定了期望:

derivedClassMock.Expect(d => d.TestProperty).Return(141);

但我一直得到以下例外:

“呼叫无效,最后一次呼叫已被使用或未进行任何呼叫(请确保您正在调用虚拟(C#)/可覆盖(VB)方法)。”

如果我将BaseClass中TestProperty的实现标记为虚拟,那么一切正常,但我试图理解为什么需要这样做。如果DerivedClass实现了IBaseInterface,我不需要将其标记为虚拟以获得部分模拟功能。 (至少我认为不是 - 如果我错了,请纠正我)

然后我进一步尝试将多模拟转换为IBaseInterface并按如下方式设置期望值:

var derivedInterface = (IBaseInterface) derivedClassMock;
derivedInterface.Expect(d => d.TestProperty).Return(1);

此测试现在无异常运行,但TestProperty返回的值不是预期的1,而是0,即int的默认值。这表明我的行为类似于存根。

如果有可能,有人可以解释一下,因为我感到困惑,能帮助我更好地理解这一点吗?我是否可以不使用继承接口部分多次模拟一个类,为什么在接口上设置期望表现出类似行为的存根?

提前致谢。

1 个答案:

答案 0 :(得分:4)

我实际上并没有使用过PartialMultiMock,但在这种情况下,您似乎试图将DerivedClass的返回值存根 - 它已将“TestProperty”实现为自动属性。因为这是一个带有setter的自动属性,所以在我看来你根本不需要对这个属性进行存根。

如果您这样做了:

var derivedClassMock = MockRepository.GenerateStub<DerivedClass>();
derivedClassMock.TestProperty = 146;