2017-03-07 86 views
0

我有以下RSpec的片段:水豚不等待完成click_button提交行动“保存”

describe "Save should create a ClassificationScheme" do 
     subject { lambda { click_button "Save"; sleep 1 } } 
     it { should change(ClassificationScheme, :count).by(1) 
    end 

如果没有“休眠1”豚不会等待被激发的操作保存按钮,规格失败。随着睡眠1是好的,但有没有更好的解决方案?

请注意,此测试使用selenium webdriver在Firefox中运行。

我的版本:

  • 轨4.1.12
  • rspec的2.99.0
  • 水豚2.4.4
  • 硒的webdriver 3.2.1
  • 火狐51.0.1

回答

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 
+0

wait_for_ajax是一个应该很少使用的拐杖,特别是随着越来越多的库/框架转向普通的JS而不是使用JQuery。正确的解决方案是在页面上设置一个可视化更改的期望。 –

+0

我同意,但问题只包括服务器端更改的测试。理想情况下,会有一个视觉指标,这就是功能规格应该寻找的。对记录更新等服务器端更改的测试属于请求规范。 –

0

当你点击一些使用水豚也不能保证通过点击触发的任何动作都完成方法返回时。这是因为水豚除了点击屏幕上的元素之外,对浏览器的功能一无所知。您不需要睡觉,而需要检查页面上可视变化的内容,以指示单击完成按钮触发的操作。这可能是一条消息,提示保存成功发生或消失的元素,等等的东西沿着

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 

注意台词:你还需要更新水豚 - 2.4.4于2014年10月发布,已经有从那以后进行了很多改进。

+0

我尝试了你的建议,看起来没什么问题,它不可靠。有时候测试失败,出现错误:'失败/错误:page.should have_text(I18n.t(:identification)+':'),期望在“”中找到文本“Identification:”。 “in”“'是非常可疑的,不知怎的,一个中间状态被水豚的信息所掩盖,这是一个空白的页面。 –

+0

@TiborNagy它应该像'Capybara.default_max_wait_time'设置得太短,不适合你正在运行的硬件。增加它或将':wait'选项传递给have_text –

+0

我还以为它,但'Capybara.default_max_wait_time'已经是10. –