Сломается ли этот тест Capybara?

При использовании 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, могу ли я гарантировать, что этот тест никогда не будет фейковым?


person tjgrathwell    schedule 27.06.2013    source источник


Ответы (1)


Вы говорите о риске кода, который обрабатывает событие проверки, выполняющееся одновременно с кодом, который проверяет наличие .spinner:not(.active). Это не риск, так как Javascript на странице однопоточный — вы можете гарантировать, что даже проверка будет обработана первой.

person jonleighton    schedule 27.06.2013