0

我正在尝试编写一个依赖于 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 客户端实例化的控制的棘手情况提出建议。

4

2 回答 2

3

除了 TrueWill 的答案,您可以为此构建一个代理:

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

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

当您使用它时,请避免调用该接口IWCFServiceClient,因为它不应该关心客户端是调用 WCF 服务还是数据库。

于 2013-09-21T08:46:48.500 回答
1

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

请参阅WCF 客户端“使用”阻止问题的最佳解决方法是什么?以便正确处理处置。

于 2013-09-21T04:25:28.710 回答