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 回答