При использовании capybara-webkit или полтергейста для проверки поведения JavaScript я часто нахожу (или, к сожалению, пишу) тесты, которые выглядят вот так
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
... где установка флажка делает некоторый запрос AJAX, который сохраняет любое состояние, позволяющее проверить его после быстрой перезагрузки.
Кажется, что этот тест гарантированно не работает, потому что, если запрос AJAX не завершится к тому времени, когда произойдет второе visit '/somewhere'
, он будет загружаться с флажком в неправильном состоянии.
К счастью, на этой странице также есть счетчик, который вращается во время выполнения запроса флажка, поэтому я могу изменить тест следующим образом.
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
# Wait for checkbox ajax to complete
page.should have_css('.spinner:not(.active)')
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
Тем не менее, я все еще немного параноик: если строка page.check
запустилась, но не смогла установить счетчик как active
перед строкой page.should have_css
, эта строка завершится успешно еще до того, как запрос начнется.
Учитывая, что JavaScript, запускаемый флажком, устанавливает класс active
, могу ли я гарантировать, что этот тест никогда не будет фейковым?