你会如何Unitest这段代码?

时间:2010-12-14 16:14:02

标签: c# unit-testing mocking

在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);
  }

感谢您的任何帮助。 谢谢!

爱丽儿

1 个答案:

答案 0 :(得分:1)

您的方法中依赖于EndpointAddress,DiscoveryEndpoint和DiscoveryClient。

首先,我将此代码放入类似工厂的地方。如果需要,我还会将上述依赖项放入工厂,然后使用将这些工厂注入到类中 IOC。

然后,我可以将假对象(或模拟)放入系统进行单元测试,而且我不必依赖具体的发现客户端(例如)。但如果这不是问题,我仍然会把它装好。

您还在寻找端点并在其上创建频道或抛出异常。好吧,如果你坚持上述,那么你需要返回默认值(T)。

这里的选择是要么将代码保留在那里然后抛出异常而不是返回null,返回null并测试它,使这个方法只做一件事,即尝试根据配置的DiscoveryClient创建一个通道

如果我这样做,我将删除所有这些依赖项,使其成为工厂(以及必要时来自工厂的其他工具),然后传入已配置的DiscoveryClient并返回null或返回NullChannel实例。

然后我可以在我的测试中返回的实例上执行断言,并且创建方法只有一个责任。

HTH