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

时间:2017-01-31 16:44:06

标签: c# web-services unit-testing wcf mocking

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

//Autogenerated Service client
public partial class ServiceClient : 
    System.ServiceModel.ClientBase<IService>, IService 
{
    //...
}
//Autogenerated Interface Client
public interface IService {
    //...
}

以下列方式:

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;
    }
}

我引用了实现,因为我想使用using语句来处理代码块末尾的资源。因为IDisposable位于ClientBase之下且界面不是部分的。

我的问题是我想模仿ServiceClient(我已经模拟了外部WsClientFactory)但是因为我使用了实现,所以我很难做到这一点。

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

1 个答案:

答案 0 :(得分:3)

班级偏袒。界面不是。

创建自己的界面,该界面派生自原始界面,并使用IDisposable进行扩展。

public interface IServiceClient: ICommunicationObject, IService, IDisposable { }

使用自定义界面扩展分部类

public partial class ServiceClient : IServiceClient { }

现在您应该能够使用带有using语句

的扩展接口
public class ExternalWsClientFactory : IExternalWsClientFactory {
    public IServiceClient ServiceClient() {
        var wsClient = new ServiceClient();
        return wsClient;
    }
}