我有以下rspec片段:
describe "Save should create a ClassificationScheme" do
subject { lambda { click_button "Save"; sleep 1 } }
it { should change(ClassificationScheme, :count).by(1)
end
没有"睡眠1" capybara不会等待保存按钮触发的操作,并且规范失败。睡眠1可以,但有没有更好的解决方案?
请注意,此测试使用selenium webdriver在Firefox中运行。
我的版本:
答案 0 :(得分:0)
您没有包含提交操作的代码,但如果有任何异步,例如Ajax请求,则提交操作本身将快速完成,而异步任务仍在处理请求。如果是这种情况,您可以使用这样的帮助:
# spec/support/wait_for_ajax.rb
module WaitForAjax
def wait_for_ajax
Timeout.timeout(Capybara.default_max_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
代码礼貌Thoughtbot。
注意,这仅包含功能规格中的帮助程序;因此,要么使用type: :feature
标记您的规范,要么更改上面的config.include
行,以便将其包含在您正在使用的任何规范类型中。
使用它:
describe "Save should create a ClassificationScheme" do
subject { lambda { click_button "Save"; wait_for_ajax } }
it { should change(ClassificationScheme, :count).by(1)
end
答案 1 :(得分:0)
当您使用Capybara单击某些内容时,无法保证在该方法返回时该单击触发的任何操作已完成。这是因为Capybara对浏览器的功能一无所知,只需点击屏幕上的元素即可。您不需要睡觉,而是需要检查页面上可视更改的内容,以指示单击按钮已完成触发的操作。这可能是一条消息,说明保存成功或元素消失等等。
的内容describe "Save should create a ClassificationScheme" do
subject { lambda { click_button "Save"; page.should have_text('Classification Saved' } }
it { should change(ClassificationScheme, :count).by(1)
end
注意:您还应该更新Capybara - 2014年10月发布的2.4.4,自那时起已经有很多改进。