Модульное тестирование клиента REST - PullRequest
11 голосов
/ 09 сентября 2011

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

Я работаю с клиентом REST для связи с Highrise (37Signals). Как я могу выполнить модульное тестирование, не полагаясь на внешнюю зависимость? (Служба ОТДЫХА).

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

Вещи, которые я хочу проверить модулем ...

  1. Метод возвращает правильное количество людей в учетной записи.
  2. Метод возвращает ноль, если в учетной записи нет людей
  3. Метод выдает исключение, если не может подключиться к службе.

Что мне сделать, чтобы проверить, что служба все еще работает так же. I.E человек все еще имеет имя? Могу ли я выполнить это модульное тестирование или это скорее интеграционный тест?

Ответы [ 4 ]

4 голосов
/ 09 сентября 2011

Я предполагаю, что ваш код теперь использует 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());
4 голосов
/ 18 октября 2012

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

Подход:

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

Это очень распространенное требование для кода модульного тестирования, который взаимодействует с внешними API REST.Имитация API-серверов на самом деле очень раздражает в настройке, обычно потому, что большинству веб-фреймворков требуется много настроек, прежде чем вы сможете начать макетировать конечные точки.Например, NancyFX и Asp.net.

В дополнение к этому может быть очень сложно утверждать данные, которые были отправлены на сервер - по сути, это означает, что вы можете только проверить, что ответ обработан правильно.

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

ПослеДолго пытаясь найти решение этой проблемы, я решил написать библиотеку для макетирования конечных точек API с использованием реального веб-сервера на основе встроенного класса HttpListener.

https://github.com/paulmorrishill/FluentSimulator

Эта библиотека поддерживает моделирование конечных точек, заголовков, ответов, медленных ответов, неудачных ответов.Каждый тип события, которое может произойти в конечной точке HTTP.

Это также позволяет утверждать, что данные, отправленные на сервер, были именно такими, как вы ожидали.

1 голос
/ 09 сентября 2011

Это пример из учебника по использованию фиктивного объекта . Поэтому вам нужно реализовать поддельный сервер, имитирующий ожидаемое вами поведение.

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