如何使用非虚函数对对象进行单元测试模拟

rya*_*ium 5 c# unit-testing mocking

我有一个使用 wsdl.exe 工具生成的 C# 类,如下所示:

public partial class SoapApi : System.Web.Services.Protocols.SoapHttpClientProtocol
{
    public SOAPTypeEnum AskServerQuestion()
    {
        object[] results = return this.Invoke("AskServerQuestion");
        return (SOAPTypeEnum) results[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一些围绕此的瘦包装器代码,用于跟踪结果等。是否可以使用任何对象模拟框架来制作一个假的 SoapApi 类,并为每个对瘦包装器函数的调用返回可预测的结果?

我无法将 AskServerQuestion() 函数设为虚拟函数,因为它是由 wsdl.exe 工具自动生成的。

Pet*_*ete 5

我实现此目的的方法是注入 ISoapApi,其中 ISoapApi 接口模仿自动生成的 SOAP API。

对于你的情况:

public interface ISoapApi
{
    SOAPTypeEnum AskServerQuestion ();
}
Run Code Online (Sandbox Code Playgroud)

然后,利用生成的 SoapApi 类是部分的这一事实,并将其添加到另一个文件中:

public partial class SoapApi : ISoapApi
{
}
Run Code Online (Sandbox Code Playgroud)

然后,消费者应该采用可以被任何模拟框架模拟的 ISoapApi 依赖项。

当然,一个缺点是,当 SOAP API 更改时,您也需要更新接口定义。