【问题标题】:Using Rails RSpec and Capybara and Selenium how can I test to make sure a modal is being displayed使用 Rails RSpec 和 Capybara 和 Selenium 我如何测试以确保显示模式
【发布时间】:2019-01-06 15:32:20
【问题描述】:

我有一个必要的模式,当用户尚未排除网站的服务条款时显示。我需要测试以确保在查看大量文档后显示引导模式,但我仍然不知道如何执行此操作。

# application.html.haml
.container-fluid
  - if user_has_not_accepted_terms?
    = render 'parts/terms_modal'

我的模态

.modal#terms_modal{'tabindex': "-1", role: "dialog", 'data- 
    keyboard':false, 'data-backdrop': "static"}
  .modal-dialog{role: "document"}
    .modal-content
      .modal-header
        %h5.modal-title
          Our Terms of Service have changed
      .modal-body
        %p
          Please take a minute and review our updated BLAH
      .modal-footer
        = link_to 'Accept Terms of Service', accept_terms_user_profile_path(current_user.id, current_user), method: :patch, class: 'btn btn-primary mx-auto'

确保模式在页面加载时打开

$(document).on('turbolinks:load', ->
  $('#terms_modal').modal('show')
)

$(document).on('page:load', ->
  $('#terms_modal').modal('show')
)

我知道我正在测试的用户尚未接受条款并且条件返回 true,当我在测试中运行 call save_and_open_page 时,我会返回包含模态的 html

到目前为止,我已经尝试过类似的测试

# accepting_terms_spec.rb
...
scenario 'user can accept terms of service', js: true do
  ... #user sign in and visit '/'

  within('.modal#terms_modal) do
    click_on('Accept Terms of Service')
  end

  expect(page).to have_content('Success')
end

我从测试中得到了 .modal 不可见的状态。

【问题讨论】:

  • 您在 Capybara 中使用什么驱动程序配置?如果您实际使用 Selenium 进行此测试,您应该能够观察浏览器并查看引导模式是否真正打开。
  • Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new(app, browser: :chrome) end Capybara.javascript_driver = :selenium_chrome
  • 好的,你还没有用js: true 标记测试 - 该测试实际上是使用 Selenium(浏览器打开)吗??
  • 是的,浏览器打开了,即使在场景“可以做”的情况下,js: true {} 我仍然得到相同的结果,还要注意当我运行 rails server 时,我确实看到了模态
  • 但是当您在浏览器中观看测试运行时,您会看到模态框吗?

标签: ruby-on-rails twitter-bootstrap selenium rspec capybara


【解决方案1】:

由于模式没有在浏览器中打开,Capybara 正确地未能通过测试。

很可能是您的某个 JS 文件中的错误导致了该问题。测试环境和开发环境之间的最大区别在于,在测试(和生产)环境中,您的所有 JS 资产都连接到一个文件中。这允许一个错误,以防止其他文件中的 JS 被处理。在开发环境中,这不会发生,因为每个文件都是单独提供的。检查您的浏览器开发者控制台是否有 JS 错误并修复它们,错误可能会消失。

不太可能的情况是您的资产管道已挂起并且不再将新的 JS 更改组合到在测试模式下提供的文件中。您应该能够使用rails assets:precompile 强制重新编译,尽管这可能仍然不会根据导致挂起的确切原因对您的资产进行未来更改。在这种情况下,执行rails assets:clobber 通常会将管道重置为正常工作(可能需要执行RAILS_ENV=test rails assets:clobber/precompile 以确保根据您的确切设置清除/构建正确的东西)

【讨论】:

  • 不幸的是,我从 chrome 控制台得到的唯一返回/错误是来自 selenium 的弃用警告。但我的代码中没有任何内容...
  • @CoreyGibson 所以如果它在开发模式下工作,在测试模式下不工作,并且真的没有任何 JS 错误,那么我只能想到 2 个其他可能性 - 1. 你的资产管道挂起 - 破坏你的预编译资产以触发新的,或者 2. 你的用户实际上并没有登录,因为你没有在访问新的 url 之前等待登录完成 - 这应该从观看测试运行中显而易见
  • 运行 rails assests:precompile 工作!想把它作为答案吗?
  • @CoreyGibson 更新了答案以包含管道信息
  • @ThomasWalpole 不应该是 rake assets:precompile 吗?这解决了我几个月来一直存在的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多