1

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

我 PartialMultiMock DerivedClass 像这样:

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

然后我设定如下期望:

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

但我不断收到以下异常:

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

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

然后我更进一步,尝试将 multi mock 转换为 IBaseInterface 并将期望设置如下:

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

该测试现在可以正常运行,但从 TestProperty 返回的值不是 1,正如预期的那样,而是 0,即 int 的默认值。这向我暗示了类似于存根的行为。

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

提前致谢。

4

1 回答 1

4

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

如果你这样做了:

var derivedClassMock = MockRepository.GenerateStub<DerivedClass>();
derivedClassMock.TestProperty = 146;
于 2009-10-01T18:21:14.980 回答