这是我的表格的简短流程:
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
答案 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请求需要花费一些时间,因为如果没有,则可以在找到禁用按钮之前重新启用按钮