Очень нужна помощь в написании теста 
Сейчас пытаюсь писать тесты с использованием моков. Как я понимаю, в основе этих тестов лежит простой принцип - каждый кусок боевого кода не должен тестироваться более одного раза. Достигается это следующим образом: делаем один тест, в котором проверяем боевой код, в остальных тестах заменяем его на мок или стаб.
Важное следствие заключается в том, что если в программе что-то ломается, то проваливается один тест - тот в котором используется боевой код. Сложность в том, что я не могу понять как правильно написать тест в следующей ситуации.
У меня есть функция do_request, которая делает запрос к серверу по HTTP протоколу и возвращает результат. В качестве параметра ей передается строка с именем метода, который нужно использовать при запросе: get или post. Допустим, для решения поставленной задачи функция выполняет следующие действия:
1. Создает объект request, который предоставляет интерфейс для обращения к серверу по HTTP протоколу;
2. В зависимости от входного параметра вызывает либо метод request.http_get, либо request.http_post;
3. Возвращает результат, полученный от сервера.
Написать тест при такой постановке задачи довольно просто. Помогает то, что у функции одна точка входа и одна точка выхода.
Теперь усложняем задачу, функция do_request - это закрытый метод класса, который не возвращает значение полученное от сервера, а сохраняет его в некоторой переменной, принадлежащей этому же классу (меняет состояние класса). Эту функцию используют два публичных метода get_page и send_form, первый должен осуществлять запрос методом get, второй post.
В данной ситуации мы не можем написать тест непосредственно для do_request. Вместо этого мы должны написать тесты для get_page и send_form. Но тогда, при поломке do_request вылетает сразу два теста. Что не совсем правильно.
Самый простой выход - сделать do_request публичной функцией. Тогда ее можно будет протестировать отдельно, а в тестах для get_page и send_form заменить на stub, который будет возвращать необходимое значение.
Проблема в том, что делать do_request публичным методом неправильно. И все мое нутро против такого подхода. Поэтому очень нуждаюсь в совете - как поступить в данной ситуации?
подписаться на блог
Sergey Avseyev
Гость
По-моему нормально, что может ломаться два теста. Чтобы избежать дублирования, можно использовать shared example group (http://rspec.info/documentation/), который будет покрывать функционал do_request, а в остальных тестах, специфичных для get_page и send_form застабить do_request, чтобы он не влиял на логику. в итоге если будет ломаться do_request, фиксить нужно будет только в одном месте.
Leave a Reply