0

sign_inユーザーにサインインするヘルパーがあります。ユーザーがポーリングを使用してサインインしたことを確認するために、新しいアプローチを使用しようとしています。

def sign_in(user, password = '111111')
  # ...
  click_button 'sign-in-btn'

  eventually(5){ page.should have_content user.username.upcase }
end

そしてここにあるeventually

module AsyncSupport
  def eventually(timeout = 2)
    polling_interval = 0.1
    time_limit = Time.now + timeout

    loop do
      begin
        yield
        rescue Exception => error
      end
      return if error.nil?
      raise error if Time.now >= time_limit
      sleep polling_interval
    end
  end
end

World(AsyncSupport)

問題は、私のテストのいくつかがエラーで失敗することです:

expected to find text "USER_EMAIL_1" in "{\"success\":true,\"redirect_url\":\"/users/1/edit\"}" (RSpec::Expectations::ExpectationNotMetError)
./features/support/spec_helper.rb:25:in `block in sign_in'
./features/support/async_support.rb:8:in `block in eventually'
./features/support/async_support.rb:6:in `loop'
./features/support/async_support.rb:6:in `eventually'
./features/support/spec_helper.rb:23:in `sign_in'
./features/step_definitions/user.steps.rb:75:in `/^I am logged in as a "([^\"]*)"$/'
features/user/edit.feature:8:in `And I am logged in as a "user"'

Failing Scenarios:
cucumber features/user/edit.feature:6 # Scenario: Editing personal data

どうすれば修正できますか?

4

1 に答える 1

1

あなたはそれをする必要はありません。

Capybara には強力な同期機能があるため、非同期プロセスの完了を手動で待つ必要はありません

のテストにpage.should have_contentはもう少し時間が必要です。ステップで、または一般的なセットアップとして行うことができます。デフォルトの待機時間は 2 秒ですが、5 秒以上必要になる場合があります。

追加Capybara.default_wait_time = 5

上記のリンクで、下を検索してAsynchronous JavaScript (Ajax and friends)を見つけます。

AsyncSupport完全に削除できるはずです。これをステップ内で設定し、それ以外の場合は待機を 2 秒にしたい場合は、ensureブロックで元の時間に戻す必要があるかもしれません。

于 2013-11-15T14:25:57.250 に答える