Единичное тестирование клиента 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. Итак, что вам нужно сделать, это реализовать поддельный сервер, имитирующий поведение, которое вы ожидаете.