【问题标题】:Rails: how can I test a stopwatch in my Capybara integration tests?Rails:如何在 Capybara 集成测试中测试秒表?
【发布时间】:2016-06-26 15:34:08
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    假设您使用的是支持 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? 方法上断言更好的错误消息

    【讨论】:

    • 表单(和测试日志)的错误消息显示表单中的 seconds_elapsed 字段未填写。这是使用 jQuery 提交时秒表跟踪的秒数,所以我的猜测是它没有正确执行或根本没有执行(这在开发和生产中都可以正常工作)。我会尝试切换驱动程序,也许会解决它。如果没有,可能 jQuery 代码中的某个地方存在仅在测试环境中显示的错误。
    • @BenLawton 你是如何填写表单域的,JS 点击处理程序?如果是这样,您是否使用支持 JS 的驱动程序(默认 capybara rack-test 驱动程序不执行 JS)?
    • 本来是用默认的,但我只是尝试设置Capybara.javascript_driver = :selenium无效。
    • @BenLawton - 如果您不将 current_driver 更改为它以进行测试,那么设置 javascript_driver 将无济于事。要进行测试,请尝试将 Capybara.current_driver = :selenium 作为测试的第一行,然后阅读 github.com/jnicklas/capybara#using-capybara-with-testunit 并正确设置测试环境
    • 太棒了,完成了这项工作。谢谢! :)
    【解决方案2】:

    (注意:非常感谢 Tom Walpole 的回答。问题是我没有使用支持 JS 的 Web 驱动程序。由于同样缺乏理解,我想我会为其他有类似问题的人写这篇文章我有。)

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

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

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

    到 Gemfile 并运行 bundle install

    你需要添加

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多