2

私は頻繁にcapybaraで問題に遭遇し、capybaraは次に進む前にajaxイベントが完了するのを待っていないため、リクエストテストが失敗します。

Googleは、これを修正するためにテストに:resynchronizeオプションを使用する必要があることを示しているようです。しかし、それは機能していません。

これが問題であることを証明するために、失敗したテストは、ajax呼び出しの後にsleepステートメントを置くことで修正できます。適切な遅延はテストを実行するマシンの速度に応じて変化するため、これは悪い習慣をハックするようです。また、適切に大きな値を選択すると、多くのajaxアクションを含むテストスイートの実行が大幅に遅くなります。

不合格/合格テストの例を以下に示します。保存をクリックする前にスリープすると、ページでの合格と不合格の違いが生じます。shouldhave_content('custom item'):

it "should be able create a new todo item", :js, :resynchronize, :focus do
  # Visit new action
  visit new_todo_list


  # Fill in the name
  fill_in "#name", "test list"

  # Click on add item to launch inline popup
  find('a.add-item').click
  within '#new_item' do
    fill_in 'todo_item_description', :with => 'custom item'
    # Run ajax action to add currrent item
    find('.btn').click
  end

  sleep(1)

  # Save
  find('a.save').click

  page.should have_content('test list')
  page.should have_content('custom item')

end

これはカピバラのバグですか、それとも私は何か間違ったことをしていますか?

助けてくれてありがとう...

4

1 に答える 1

4

私はしばらく前にこれに問題があり、このアプローチを使用してajaxリクエストがいつ行われるかを把握しました:

wait_until do
  page.evaluate_script('$.active') == 0
end

まだかなりハッキーですが、を使用するよりも少し優れていsleepます。ここからもらった。私はこれをCucumber機能に使用していますが、rspecリクエスト仕様でも機能するはずです。

更新(2013年6月19日)

wait_untilバージョン2.0でCapybaraから削除されました。理由の詳細については、 「wait_untilがCapybaraから削除された理由」を参照してください。

私は提案の1つに従い、とにかくそれを実装しました。これは、この1つのケース(正当化されると思います)のためだけです。

def wait_until
  require "timeout"
  Timeout.timeout(Capybara.default_wait_time) do
    sleep(0.1) until value = yield
    value
  end
end
于 2012-08-02T12:19:22.190 に答える