在Unitestsing中需要一些帮助。 (假设我没有TypeMock)
您是否会更改代码以注入模拟代替EndpointAddress,DiscoveryEndpoint,DiscoveryClient?
你会写什么样的考试?我能想到
GetService_ServiceExist_ResultShouldBeAnInstance
GetService_ServiceIsNotExist_ResultShouldNull
static public T GetService<T>(Binding binding, string address)
{
Contract.Requires(binding != null);
Contract.Requires(!string.IsNullOrWhiteSpace(address));
var endpointAddress= new EndpointAddress(address);
var discoveryEndpoint = new DiscoveryEndpoint(binding, endpointAddress);
var discoveryClient = new DiscoveryClient(discoveryEndpoint);
try
{
// Find ICalculatorService endpoints
FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(T)));
Contract.Assume(findResponse != null);
Contract.Assume(findResponse.Endpoints != null);
// Check to see if endpoints were found, if so then invoke the service.););
if (findResponse.Endpoints.Count > 0)
{
Contract.Assume(findResponse.Endpoints[0] != null);
return ChannelFactory<T>.CreateChannel(new BasicHttpBinding(),
findResponse.Endpoints[0].Address);
}
}
catch (TargetInvocationException ex)
{
Console.WriteLine("This client was unable to connect to and query the proxy. Ensure that the proxy is up and running: " + ex);
}
return default(T);
}
感谢您的任何帮助。 谢谢!
爱丽儿
答案 0 :(得分:1)
您的方法中依赖于EndpointAddress,DiscoveryEndpoint和DiscoveryClient。
首先,我将此代码放入类似工厂的地方。如果需要,我还会将上述依赖项放入工厂,然后使用将这些工厂注入到类中 IOC。
然后,我可以将假对象(或模拟)放入系统进行单元测试,而且我不必依赖具体的发现客户端(例如)。但如果这不是问题,我仍然会把它装好。
您还在寻找端点并在其上创建频道或抛出异常。好吧,如果你坚持上述,那么你需要返回默认值(T)。
这里的选择是要么将代码保留在那里然后抛出异常而不是返回null,返回null并测试它,使这个方法只做一件事,即尝试根据配置的DiscoveryClient创建一个通道
如果我这样做,我将删除所有这些依赖项,使其成为工厂(以及必要时来自工厂的其他工具),然后传入已配置的DiscoveryClient并返回null或返回NullChannel实例。
然后我可以在我的测试中返回的实例上执行断言,并且创建方法只有一个责任。
HTH