我正在尝试编写一个依赖于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客户端实例化的控制。
答案 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?以正确处理处理。