繁体   English   中英

Rails:如何在我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM