Я хотел бы узнать об идиомах или рекомендациях по тестированию многоэтапного рабочего процесса с использованием rspec.
Возьмем в качестве примера систему «корзина для покупок», где процесс покупки может быть
- когда пользователь отправляет в корзину, и мы не используем https, перенаправляем на https
- когда пользователь отправляет в корзину, и мы используем https и нет файла cookie, создайте и отобразите новую корзину и отправьте обратно файл cookie
- когда пользователь отправляет в корзину, и мы используем https, и есть действительный файл cookie, а новый элемент предназначен для продукта, отличного от первого элемента, добавьте строку в корзину и отобразите обе строки
- когда пользователь отправляет в корзину, и мы используем https, и есть действительный файл cookie, и новый элемент предназначен для того же продукта, что и предыдущий, увеличьте количество этой строки корзины и отобразите обе строки
- когда пользователь нажимает «оформить заказ» на странице корзины и использует https, и есть файл cookie, а корзина не пуста и...
- ...
Я прочитал http://eggsonbread.com/2010/03/28/my-rspec-best-practices-and-tips/, который советует, в частности, что каждый «it-блок» должен содержать только одно утверждение: вместо выполнения вычислений и последующего тестирования нескольких атрибутов в одном и том же блок, используйте «до» внутри контекста, чтобы создать (или получить) тестируемый объект и назначить его @some_instance_variable, затем запишите каждый тест атрибута как отдельный блок. Это немного помогает, но в случае, описанном выше, когда шаг тестирования n требует выполнения всей настройки для шагов [1..n-1], я обнаруживаю, что либо дублирую код настройки (очевидно, не очень хорошо), либо создаю множество вспомогательных функций. со все более громоздкими именами (def create_basket_with_three_lines_and_two_products) и вызывая их последовательно в блоке перед каждым шагом.
Любые советы о том, как сделать это менее подробно/утомительно? Я ценю общий принцип, лежащий в основе идеи о том, что каждый пример не должен зависеть от состояния, оставленного предыдущими примерами, но когда вы тестируете многоэтапный процесс и что-то может пойти не так на любом этапе, настройка контекста для каждого шага неизбежно потребуется повторный запуск всех настроек для предыдущих n шагов, так что...