1

我想使用我在测试类中使用的模拟库的一个实例,但是,对于某些测试,我可能想模拟其中一个成员函数来执行/返回模拟行为/返回值;对于其他测试,我可能想要库的未模拟(本机)功能。有没有办法在一个实例中的设置(模拟行为)和另一个实例中的“UNSetup”(非模拟行为)之间进行交换?

4

2 回答 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 回答