单元测试依赖于wcf服务的对象

时间:2013-09-21 04:05:46

标签: .net wcf unit-testing dependency-injection

我正在尝试编写一个依赖于WCF服务的类,我希望我的类可以进行单元测试。我想出了下面的代码,但遇到了一些棘手的情况

public class BenefitReason
{
    private IWCFServiceClient _client;

    public  BenefitReason(IWCFServiceClient client)
    {
       _client = client;
    }

    public CanIssueEmercengyBenefit(string benefitReasonCode)
    {
         client.GetEmergencyBenefits().contains(benefitReasonCode);
    }
    //Rest of implementation for Benefit Reason
}

这是单元可测试的,因为我可以模拟IWCFServiceClient,但是我失去了对我的客户端的控制权。如果客户端通道在创建BenefitReason对象和调用CanIssueEmercengyBenefit的时间之间关闭,则会发生异常。

请告知如何克服编写代码的棘手情况,这些代码可以进行单元测试,而不会失去对wcf客户端实例化的控制。

2 个答案:

答案 0 :(得分:3)

除TrueWill的答案外,您还可以为此构建代理:

public WCFServiceClientProxy : IWCFServiceClient
{
    public Benefit[] GetEmergencyBenefits()
    {
        using (var client = new WCFServiceClient())
        {
            return client.GetEmergencyBenefits();
        }
    }
}

通过在每次调用时注入WCFServiceClientProxy,可以防止任何失败并允许客户端不知道WCF服务。

当你处于此状态时,请阻止调用该接口IWCFServiceClient,因为它不应该与客户端有关,无论是调用WCF服务还是数据库。

答案 1 :(得分:1)

一种选择是在接口实现的每个方法调用中实例化和处置WCF服务客户端。

请参阅What is the best workaround for the WCF client `using` block issue?以正确处理处理。