我有使用 MoQ 创建部分存根的代码。我更喜欢与接口交互而不是具体实现,这样如果我有不同的接口实现,我就不必修改单元测试。
例如,我有一个工厂方法,例如:
private Mock<ISomeInterface> ISomeInterfaceStubFactory()
{
return new Mock<SomeConcreteImplementation>();
}
下面是调用该方法的代码:
var partialStub = ISomeInterfaceStubFactory();
partialStub.Setup(m => m.MethodToStubOutThatMethodToTestCalls(It.IsAny<string>())).Returns(new List<SomeOtherObject>());
partialStub.CallBase = true;
var actualResult= partialStub.Object.MethodToTest();
Assert.That(actualResult, Is.EqualTo(expectedResult));
问题是这样做时 ISomeInterfaceStubFactory 不会编译。所以我将其更改为如下所示,但这样做似乎会破坏部分存根。实际实现的MethodToStubOutThatMethodToTestCalls
操作被调用,而不是存根版本。基本上我正在尝试对存根对象使用多态性。有没有办法做到这一点?我希望我的单元测试不会与具体实现高度耦合。
private Mock<ISomeInterface> ISomeInterfaceStubFactory()
{
return new Mock<SomeConcreteImplementation>.As<ISomeInterface>();
}