1

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スピナーを設定できなかった場合、その行はリクエストが開始される前に成功します。activepage.should have_css

チェックボックスによってトリガーされた JavaScript がactiveクラスを設定することを考えると、このテストがフレークしないことを保証できますか?

4

1 に答える 1

2

あなたが話しているのは、 check イベントを処理するコードが、をチェックするコードと同時に.spinner:not(.active)実行されるリスクです。ページの Javascript はシングルスレッドであるため、これはリスクではありません。チェックが最初に処理されることを保証できます。

于 2013-06-27T08:02:06.873 に答える