单元测试服务和模拟自动生成的 WCF 客户端代理

pan*_*nox 4 c# wcf unit-testing web-services mocking

我在服务中引用自动生成的 WCF 客户端。

//Autogenerated Service client
public partial class ServiceClient : 
    System.ServiceModel.ClientBase<IService>, IService 
{
    //...
}
//Autogenerated Interface Client
public interface IService {
    //...
}
Run Code Online (Sandbox Code Playgroud)

通过以下方式:

public MyService{

    public IExternalWsClientFactory ExternalWsClientFactory {get; set; }

    public void MyMethod(){
        using (var wsCliente = ExternalWsClientFactory.ServiceClient())
        { 
            //... 
        }
    }
}

public class ExternalWsClientFactory : IExternalWsClientFactory
{
    public ServiceClient ServiceClient()
    {
        var wsClient = new ServiceClient();
        return wsClient;
    }
}
Run Code Online (Sandbox Code Playgroud)

我引用该实现是因为我想使用该using语句在代码块末尾释放资源。而且因为IDisposable是在下面ClientBase而且界面不偏。

我的问题是我想模拟ServiceClient(我已经模拟了External WsClientFactory),但由于我使用了该实现,所以我很难做到这一点。

ServiceClient注意:实现中自动生成的方法不是virtual.

Nko*_*osi 5

班级是偏科的。接口不是。

创建您自己的接口,该接口派生自原始接口并使用IDisposable.

public interface IServiceClient: ICommunicationObject, IService, IDisposable { }
Run Code Online (Sandbox Code Playgroud)

使用您的自定义接口扩展分部类

public partial class ServiceClient : IServiceClient { }
Run Code Online (Sandbox Code Playgroud)

现在您应该能够使用带有using语句的扩展接口

public class ExternalWsClientFactory : IExternalWsClientFactory {
    public IServiceClient ServiceClient() {
        var wsClient = new ServiceClient();
        return wsClient;
    }
}
Run Code Online (Sandbox Code Playgroud)