Rails:如何在我的Capybara集成测试中测试秒表?

时间:2016-06-26 15:34:08

标签: jquery ruby-on-rails capybara integration-testing testunit

目前正在为我的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

^这是我想要它做的事情的要点,但是睡眠显然不起作用,因为它完全暂停了线程,而我希望测试有点"等待"而秒表做了几秒钟的事情。上述测试失败,因为没有实际跟踪时间;在播放后立即点击暂停,在计时器的眼中,因此提交表单时没有记录实际时间,这当然会引发验证错误。

有没有一种方法可以模拟等待几秒而不会实际挂起线程?

2 个答案:

答案 0 :(得分:0)

假设您正在使用支持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?方法上声明

答案 1 :(得分:0)

(注意:非常感谢Tom Walpole的答案。问题是我没有使用支持JS的网络驱动程序。我认为我会因为同样缺乏理解而为其他有类似问题的人写这篇文章。我有。)

问题是我没有使用执行Javascript的Web驱动程序。默认情况下,Capybara使用:rack_test驱动程序,虽然速度很快,但不会执行Javascript。

因此,对于依赖于JS执行的集成测试(在我的情况下与秒表交互),像:poltergeist这样的东西是个好主意。要进行设置,请添加

  gem 'poltergeist'
  gem 'phantomjs', :require => 'phantomjs/poltergeist'

到Gemfile并运行bundle install

您需要添加

  require 'capybara/poltergeist'
  Capybara.javascript_driver = :poltergeist

到你的test / spec帮助文件。然后,您需要做的只是在需要启用JS的集成测试的任何地方设置Capybara.current_driver = Capybara.javascript_driver

相关问题