Я хотел бы узнать об идиомах или передовых методах тестирования многошагового рабочего процесса с использованием 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 блок» должен содержать толькоy одно утверждение: вместо того, чтобы выполнять вычисления и затем тестировать несколько атрибутов в одном и том же блоке, используйте «до» внутри контекста, чтобы создать (или получить) тестируемый объект и назначить его @some_instance_variable, а затем записать каждый тест атрибута какотдельный блок.Это немного помогает, но в случае, подобном описанному выше, где этап n тестирования требует выполнения всей настройки для шагов [1..n-1], я обнаруживаю, что либо дублирую код установки (очевидно, не очень хороший), либо создаю множество вспомогательных функций.со все более громоздкими именами (def create_basket_with_three_lines_and_two_products) и последовательным их вызовом в каждом шаге перед блоком before.
Какие-нибудь советы о том, как сделать это менее многословно / утомительно?Я ценю общий принцип, лежащий в основе идеи о том, что каждый пример не должен зависеть от состояния, оставленного предыдущими примерами, но когда вы тестируете многоэтапный процесс, и на любом этапе все может пойти не так, настройка контекста для каждого шаганеизбежно потребуется перезапустить все настройки для предыдущих n шагов, так что ...