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

4

我正在引用一个自动生成的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”的。

这个类是部分类,但接口不是。创建一个继承自原始接口并使用 IDisposable 扩展它的自定义接口。将部分类与您的自定义接口扩展,现在您应该能够使用 using 语句来使用您扩展的接口。 - Nkosi
哦,天哪!我希望有一种懒人的方法来完成这个。我有11个Web服务引用。谢谢@Nkosi。 - panox
1个回答

5

这个类是局部的,而接口不是。

创建一个新的接口,从原始接口继承并通过添加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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接