Как выполнить модульное тестирование клиента WCF, созданного с помощью WCF Rest Starter Kit - PullRequest
2 голосов
/ 05 мая 2009

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

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

Итак, у меня есть этот пример метода, который отправляет через HTTP некоторые данные, используя datacontract и 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 в качестве моей среды для моделирования, поэтому я не могу смоделировать / заглушить конкретные классы, и я хотел бы придерживаться этого, потому что я действительно считаю, что моделирование конкретных классов не очень элегантно.

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

PD: для предварительного просмотра стартового комплекта WCF 2

Ответы [ 2 ]

2 голосов
/ 04 августа 2009

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

2 голосов
/ 05 мая 2009

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

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

С уважением, Пабло.

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