![](/img/trans.png)
[英]rails3-jquery-autocomplete: how to test with RSpec and Capybara?
[英]Rails: how can I test a stopwatch in my Capybara integration tests?
目前为我的Rails应用程序的时间跟踪功能编写测试。 我无法想出一种方法来模拟单击计时器上的“播放”按钮,等待几秒钟,单击暂停,然后提交表单(创建一个新的Timestamp对象)。
test "track time with stopwatch" do
visit new_project_timestamp_path(@project)
find('#play_button').click
sleep 4.0
find('#pause_button').click
click_button "submit_new_timestamp"
visit project_path(@project)
assert page.has_content? "4 seconds"
end
^这是我想要它做的要点,但是睡眠显然不起作用,因为它完全悬挂线程,而我希望测试有点“等待”,而秒表做它的东西几秒钟。 上述测试失败,因为没有实际跟踪时间; 在播放后立即点击暂停,在计时器的眼中,因此提交表单时没有记录实际时间,这当然会引发验证错误。
有没有办法我可以模拟等待几秒而不实际挂起线程?
假设您正在使用具有JS功能的驱动程序(selenium,poltergeist,capybara-webkit),那么浏览器,测试中的应用程序和测试都会在自己的线程/进程中运行,因此在测试线程中休眠应该非常好。 而不是在没有时间差异的情况下提交两次点击,您的click_button
更有可能被紧随其后的visit
取消,因此您没有创建新的时间戳。 您需要声明“click_button”和“visit”之间的某种可见变化,以确保在告诉浏览器请求新页面之前创建新的时间戳操作已完成
click_button "submit_new_timestamp"
page.assert_text "Timestamp created" # whatever message/visible change occurs after clicking the button
visit project_path(@project)
另外,使用assert_text,assert_selector,assert_title,assert_current_path匹配器会在断言失败时为您提供更好的错误消息,而不是在has_xxx?
上断言has_xxx?
方法
(注意:非常感谢Tom Walpole的回答。问题是我没有使用支持JS的网络驱动程序。我想我会为其他有类似问题的人写这篇文章,因为我对此缺乏了解。 )
问题是我没有使用执行Javascript的Web驱动程序。 默认情况下, :rack_test
使用:rack_test
驱动程序,虽然速度很快,但不执行Javascript。
因此,对于依赖于JS执行的集成测试(在我的情况下与秒表交互),类似于:poltergeist
是一个好主意。 要进行设置,请添加
gem 'poltergeist'
gem 'phantomjs', :require => 'phantomjs/poltergeist'
到Gemfile并运行bundle install
。
你需要添加
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
到您的测试/规范帮助文件。 然后你需要做的就是设置Capybara.current_driver = Capybara.javascript_driver
无论你需要一个支持JS的集成测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.