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