Capybara期待在ajax请求完成之前

时间:2015-10-02 13:35:12

标签: ruby-on-rails ruby ruby-on-rails-4 rspec capybara

这是我的表格的简短流程:

  1. 您点击提交按钮
  2. 提交按钮被停用
  3. AJAX请求发送给API。
  4. 收到AJAX回复。
  5. 按钮可再次点击。
  6. scenario 'user can not resubmit form before API response' do
      expect(find_button('Submit')[:disabled]).to be_falsey
      click_button 'Submit'
      expect(find_button('Submit')[:disabled]).not_to be_falsey
      ## Here ajax response is received
      expect(find_button('Submit')[:disabled]).to be_falsey
    end
    

    这个测试实际上已通过,但我觉得我无法控制它,我不担心它是否真的测试了我的意图。

    有没有办法更好地控制AJAX响应?此测试是否实际测试了我描述的功能?

    编辑:

    此测试实际上随机失败/通过。我猜这是因为在AJAX调用

    之后执行expect(find_button('Submit')[:disabled]).not_to be_falsey

2 个答案:

答案 0 :(得分:0)

Automatically wait for AJAX with Capybara

# spec/support/wait_for_ajax.rb
module WaitForAjax
  def wait_for_ajax
    Timeout.timeout(Capybara.default_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end
end

RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
end

用法:

scenario 'user can not resubmit form before API response' do
  expect(find_button('Submit')[:disabled]).to be_falsey
  click_button 'Submit'
  expect(find_button('Submit')[:disabled]).not_to be_falsey
  wait_for_ajax
  expect(find_button('Submit')[:disabled]).to be_falsey
end
  

帮助程序使用jQuery.active变量来跟踪数量   有效的AJAX请求。当它为0时,没有活动的AJAX请求,   意味着所有请求都已完成。

答案 1 :(得分:0)

测试没有测试你想要的东西,因为你在查找器外查询disabled属性,这意味着Capybaras重试行为不起作用。相反,您希望对finder使用disabled选项

expect(find_button('Submit', disabled: false)).to be
click...
expect(find_button('Submit', disabled: true)).to be
...

这样,Capybara可以重试查找,直到它通过(或超时)。注意:此测试依赖于Ajax请求需要花费一些时间,因为如果没有,则可以在找到禁用按钮之前重新启用按钮