capybara-webkit や pollergeist を使用して 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 リクエストが 2 番目の発生時までに完了しない場合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
クラスを設定することを考えると、このテストがフレークしないことを保証できますか?