使用Moq调用验证基类中的非虚方法

时间:2014-05-14 17:35:32

标签: c# unit-testing mocking xamarin moq

这篇文章要求基类方法是虚拟的:question link

这对我不起作用,因为基类方法不是虚拟的(我没有编写它,也没有源代码)。

如果它们不是虚拟的,我如何模拟并验证基类方法是否被调用?

最新标准 - 我正在Mac上使用Xamarin Studio进行开发。 Moq工作正常,但其他框架如TypeMock或JustMock(Windows安装程序)将无法正常工作。

2 个答案:

答案 0 :(得分:3)

这是不可能的。由于Moq的工作方式,Moq没有机会模拟非虚方法。

您是否直接嘲笑班级类型YourClass,其中YourClass来自BaseClass,而BaseClass是否(public?)非虚拟非您感兴趣的静态方法?因此,您的模拟类型为Mock<YourClass>,而不是Mock<IYourClass>,其中IYourClass是一个接口?

您是否必须使用BaseClass作为基类,而不是“编写”(类BaseClass的字段在您的类中)?

答案 1 :(得分:1)

如上所述,Moq只能模拟虚拟方法。
一个可能的最终运行是将您的un moqable类包装在代理中,并在代码中使用此代理。

public class MyUnMoqableClass {
    public string GetValue() {
        return "Hello World";
    }
}

public interface IMyUnMoqableClassProxy {
    string GetValue();
}

public class UnMoqableClassProxy : IMyUnMoqableClassProxy {

    private readonly MyUnMoqableClass _myUnMoqableClass;

    public UnMoqableClassProxy(MyUnMoqableClass myUnMoqableClass) {
        _myUnMoqableClass = myUnMoqableClass;
    }

    public string GetValue() {
        return _myUnMoqableClass.GetValue();
    }

}

如果你在unmoqable类上有一个大的接口,但确实让一个人隔离了客户端代码,那可能有点(很多)乏味。