Как выполнить модульное тестирование клиента WCF, созданного с помощью WCF Rest Starter Kit
-
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");
}
}
}
Этот метод работает и действительно правильно публикует данные и сериализует.
Что я хочу сделать, так это провести модульное тестирование.
Мои вопросы:
Как мне создать заглушки/макеты для HttpContextExtensions, зная, что он не реализует какой-либо интерфейс?
А для HttpClient?это хуже всего, поскольку он полон методов расширения, определенных где-то еще (методы Post и подобные являются расширениями).
В 2.Думаю, я могу придерживаться «Отправить», и это будет перегружено, но тогда возникнет та же проблема, что и в 1.
Я собирался извлечь интерфейсы для HttpContextExtensions и HttpClient, создать дочерние элементы для каждого из них и реализовать делегирование интерфейсов родительскому элементу, а затем использовать интерфейсы в моем коде.
Но это большой труд, ИМХО.
Я использую RhinoMocks в качестве своей среды для насмешек, поэтому я не могу имитировать/заглушать конкретные классы, и мне бы хотелось придерживаться этого, потому что я действительно считаю, что издевательство над конкретными классами не очень элегантно.
Итак, существует ли более чистый/быстрый/умный способ создания кода модульного теста, подобный приведенному выше?
ПД:Это предварительная версия стартового набора WCF 2.
Решение
Если вы действительно хотите имитировать этот код, подход, который может работать для этого сценария, — получить экземпляр HttpClient в классе ServiceClient.Класс HttpClient содержит конвейер обработки, который можно настроить с помощью пользовательских обработчиков.Для ваших тестов вы можете в принципе внедрить обработчик в этот экземпляр httpclient, чтобы вернуть имитированный ответ на тест до того, как реальная служба будет вызвана в последнем обработчике (этап транспорта).Взгляните на этот пост, чтобы получить представление о том, как это можно реализовать.
Привет Пабло.
Другие советы
Я написал большую часть кода HttpClient. Предложение Пабло - то, что я сделал в модульных тестах - см. FixedTransport.cs в исходном zip-файле.