Как выполнить модульное тестирование клиента WCF, созданного с помощью WCF Rest Starter Kit

StackOverflow https://stackoverflow.com/questions/823276

  •  05-07-2019
  •  | 
  •  

Вопрос

Я создал несколько сервисов POX, используя стартовый комплект REST.Поначалу было немного сложно создавать модульные тесты для уровня сервисов, но, в конце концов, они были хорошо спроектированы, и мне удалось имитировать контекст и оправдать ожидания.

Но сейчас я начинаю с клиентской части, и у меня возникли некоторые проблемы с выяснением того, как издеваться над вещами.Это не так просто.

Итак, у меня есть пример метода, который отправляет через HTTP некоторые данные, используя контракт данных и XML в качестве транспорта.

public class ServiceClient: IService

{
    private const string uri_template = "http://{0}:{1}/SomeService.svc/";
    private readonly HttpClient http = new HttpClient();

    public ServiceClient(string host, int port)
    {
        http.BaseAddress = new Uri(string.Format(uri_template , host, port));
    }

    public void Create(MyDataContract my_data_contract)
    {
        var content = HttpContentExtensions
                        .CreateDataContract(
                          my_data_contract, 
                          Encoding.Default, 
                          "text/xml", 
                          null);
        var response = http.Post("Create", content);
        if (response.StatusCode != HttpStatusCode.Created) {
            throw new Exception("something is not right");
        }
    }
}

Этот метод работает и действительно правильно публикует данные и сериализует.

Что я хочу сделать, так это провести модульное тестирование.

Мои вопросы:

  1. Как мне создать заглушки/макеты для HttpContextExtensions, зная, что он не реализует какой-либо интерфейс?

  2. А для HttpClient?это хуже всего, поскольку он полон методов расширения, определенных где-то еще (методы Post и подобные являются расширениями).

В 2.Думаю, я могу придерживаться «Отправить», и это будет перегружено, но тогда возникнет та же проблема, что и в 1.

Я собирался извлечь интерфейсы для HttpContextExtensions и HttpClient, создать дочерние элементы для каждого из них и реализовать делегирование интерфейсов родительскому элементу, а затем использовать интерфейсы в моем коде.

Но это большой труд, ИМХО.

Я использую RhinoMocks в качестве своей среды для насмешек, поэтому я не могу имитировать/заглушать конкретные классы, и мне бы хотелось придерживаться этого, потому что я действительно считаю, что издевательство над конкретными классами не очень элегантно.

Итак, существует ли более чистый/быстрый/умный способ создания кода модульного теста, подобный приведенному выше?

ПД:Это предварительная версия стартового набора WCF 2.

Это было полезно?

Решение

Если вы действительно хотите имитировать этот код, подход, который может работать для этого сценария, — получить экземпляр HttpClient в классе ServiceClient.Класс HttpClient содержит конвейер обработки, который можно настроить с помощью пользовательских обработчиков.Для ваших тестов вы можете в принципе внедрить обработчик в этот экземпляр httpclient, чтобы вернуть имитированный ответ на тест до того, как реальная служба будет вызвана в последнем обработчике (этап транспорта).Взгляните на этот пост, чтобы получить представление о том, как это можно реализовать.

http://weblogs.asp.net/cibrax/archive/2009/03/18/negotiating-a-saml-token-for-rest-clients-with-httpclient.aspx

Привет Пабло.

Другие советы

Я написал большую часть кода HttpClient. Предложение Пабло - то, что я сделал в модульных тестах - см. FixedTransport.cs в исходном zip-файле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top