Тестирование прогрессивно улучшенных функций с Capybara
Я использую Capybara для тестирования функций на прогрессивно улучшенном веб-сайте. Допустим, моя особенность заключается в том, чтобы перемещаться по иерархии мест. Версия без javascript включает в себя получение новой версии страницы, когда мы кликаем по разным местам. Усовершенствованная версия JavaScript открывает скрытые элементы или загружает новую информацию через Ajax.
Я начну с написания теста для не JavaScript-версии, которая выглядит примерно так:
When I visit the page for "UK"
And I click "London"
Then I should see the information for "London"
Используя драйвер механизации по умолчанию, тест не пройден, я разрабатываю функцию, затем тест проходит.
Затем я создаю идентичный тест для версии javascript, помеченный @javascript. Он запускает тест с драйвером javascript, и этот тест проходит, потому что функция была реализована. (Он проходит через поток не-JS). Тем не менее, я хочу, чтобы версия теста на javascript провалилась на этом этапе, потому что функция еще не была расширена с помощью Javascript.
Поэтому я ищу хорошую стратегию для определения того, пришла ли с сервера новая страница или нет, и чтобы обе версии функции работали. (Я планирую интегрировать это с pushState, так что тестирование на измененный URL не пройдет)
2 ответа
Мне интересно услышать мнения других людей по этому поводу - я не уверен, что Cucumber является подходящим инструментом для работы, поскольку вы описываете функции с точки зрения взаимодействия с пользователем, и, похоже, ваша реализация прогрессивного улучшения приведет к по сути то же самое взаимодействие с пользователем.
Помимо этого, я думаю, что вы можете подумать о том, чтобы встроить какой-нибудь тестовый хук в саму страницу, чтобы помочь с этим. Трудно сказать, что, не зная вашей точной ситуации, но, возможно, один из:
- Версия страницы с расширенным сценарием может добавить некоторый элемент в DOM, указывая, что расширения активны, или указывая, что данные получены из запроса AJAX, а не загрузки страницы.
- Вы можете генерировать случайный идентификатор страницы (с сервера) при каждой загрузке (например, новый GUID), встраивать его в DOM и утверждать, что он не изменился после взаимодействия (в расширенной версии). Это был бы очень простой способ достижения поставленной цели ("определение того, пришла ли целая новая страница с сервера")
Почему ваша "улучшенная" версия javascript работает так же, как и не расширенная версия? Ваши тесты на огурец, использующие @javascript, должны тестироваться, чтобы убедиться, что улучшения работают.
Например, * если JavaScript открывает модальное диалоговое окно вместо ссылки на новую страницу, проверьте это. * если javascript отправляет форму и обновляет значение, проверьте это.
Эти тесты не пройдут, если они будут выполняться без поддержки JavaScript.