Единичное тестирование клиента REST

Я новичок в модульном тестировании, но я пытаюсь включить его в свой процесс разработки для любого нового кода, который я пишу (включая исправления ошибок).

Я работаю клиентом REST для связи с Highrise (37Signals). Как я могу unit test, не полагаясь на внешнюю зависимость? (Служба REST).

Например, у меня будет метод под названием GetPeople()

Вещи, которые я хочу, чтобы unit test...

  • Метод возвращает правильное количество людей в учетной записи.
  • Метод возвращает null, если в аккаунте нет людей
  • Метод генерирует исключение, если он не может подключиться к службе.

Что мне делать, чтобы проверить, что служба по-прежнему работает одинаково. У человека все еще есть Имя? Могу ли я unit test это или это еще один тест интеграции?

Ответ 1

Я предполагаю, что ваш код теперь напрямую использует HttpWebRequest и HttpWebResponse. Если это случай, замените все вхождения HttpWebRequest на IRequest и HttpWebResponse на IResponse. Определите эти два интерфейса и вы увидите свойства и методы, которые вам нужны, например:

public interface IRequest
{
    IResponse GetResponse(string url);
    IResponse GetResponse(string url, object data);
}

public interface IResponse
{
    Stream GetStream();
}

Затем нужно просто реализовать эти интерфейсы дважды; один раз для реального приложения (используя HttpWebRequest и HttpWebResponse для выполнения HTTP-материала) и один раз для тестов (не используя HTTP, но вместо этого, возможно, записывая на консоль, журнал или что-то подобное).

Затем, когда вы создаете экземпляр своего клиента, просто нужно ввести реализацию IRequest, которую вы хотите:

var realClient = new Client(new MyHttpRequest());
var testClient = new Client(new MyTestRequest());

Ответ 2

Для всех тех, кто пытается протестировать фактические HttpWebRequest и HttpWebResponse, а не издевки. Я упомянул здесь подход: http://nripendra-newa.blogspot.com/2012/10/testing-rest-clients.html. Я бы назвал это интеграционным тестом, а не unit test. Пожалуйста, ознакомьтесь с практической реализацией: https://github.com/nripendra/Resty.Net/blob/master/tests/Resty.Net.Tests/RestRequestTest.cs

Подход:

  • Использовать встроенный веб-сервер. Я использовал NancyFx, но вы можете использовать любые, например. каяк, кассини и т.д.

Ответ 3

Это пример учебника для использования mock object. Итак, что вам нужно сделать, это реализовать поддельный сервер, имитирующий поведение, которое вы ожидаете.