Как бы вы переориентировали этот код? - PullRequest
0 голосов
/ 14 декабря 2010

Нужна помощь в 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);
  }

Ценю любую вашу помощь. Спасибо!

Ariel

1 Ответ

1 голос
/ 14 декабря 2010

В вашем методе есть зависимость от EndpointAddress, DiscoveryEndpoint и DiscoveryClient.

Прежде всего, я бы поместил этот код во что-то, напоминающее фабрику. Я также поместил бы вышеупомянутые зависимости в фабрики в случае необходимости и затем ввел бы те фабрики в класс, используя МОК.

Тогда это позволяет мне помещать поддельные объекты (или макеты) в систему для модульного тестирования, и мне не нужно полагаться на конкретного клиента обнаружения (например). Но если бы это не было проблемой, я бы по-прежнему фабриковал это.

Вы также пытаетесь найти конечную точку и создать для нее канал или создать исключение. Хорошо, если вы придерживаетесь вышеизложенного, вам нужно возвращать default (T).

Здесь нужно либо сохранить код, а затем выдать исключение, а не возвращать ноль, вернуть ноль и проверить его, заставить этот метод делать только одну вещь - попытаться создать канал на основе настроенного DiscoveryClient. .

Если бы я делал это, я бы удалил все эти зависимости, сделал бы его фабрикой (и другими, если необходимо, фабриками), затем передал бы настроенный DiscoveryClient и либо возвратил бы нуль, либо возвратил бы экземпляр NullChannel.

Затем я могу сделать утверждение для экземпляра, возвращенного в моем тесте, и метод создания несет только одну ответственность.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...