我想使用我在测试类中使用的模拟库的一个实例,但是,对于某些测试,我可能想模拟其中一个成员函数来执行/返回模拟行为/返回值;对于其他测试,我可能想要库的未模拟(本机)功能。有没有办法在一个实例中的设置(模拟行为)和另一个实例中的“UNSetup”(非模拟行为)之间进行交换?
问问题
429 次
2 回答
2
没有任何内置机制可以做到这一点,但部分模拟可以让你做同样的事情(有一些限制)。Parial mock允许您模拟接口的具体实现,而不是单独的接口,如下所示:
var partialMock = new Mock<ServiceImplementation>();
限制是您可能要模拟的所有方法都必须是虚拟的,否则 Moq 无法拦截它们:
public class ServiceImplementation
{
public virtual int SomeMethod()
{
return 5;
}
public virtual int SomeOtherMethod()
{
return SomeMethod()*2;
}
}
var partialMock = new Mock<ServiceImplementation>();
// we stub one method
partialMock.Setup(m => m.SomeMethod()).Returns(3);
// and use other's real implementation
var value = partialMock.Object.SomeOtherMethod();
问题当然在于虚拟;如果你不能让你的成员虚拟化,这显然是行不通的。虽然有一个小的解决方法 - 使用真正的实现作为存根设置的一部分:
// note we base our stub on interface now
var implementation = new ServiceImplementation();
var mock = new Mock<IServiceImplementation>();
// we call real implementation as part of return setup
mock.Setup(m => m.SomeMethod()).Returns(implementation.SomeMethod());
于 2012-03-07T07:16:35.773 回答
1
关于什么:
MyMock.CallBase = true;
对于任何未设置的方法,真正的实现被称为......
于 2012-08-09T07:33:56.503 回答