使用 Rails RSpec 和 Capybara 和 Selenium 我如何测试以确保显示模态

Using Rails RSpec and Capybara and Selenium how can I test to make sure a modal is being displayed

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

# 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'

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

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

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

我知道我正在测试的用户还没有接受条款和条件 returns true,当我 运行 在我的测试中调用 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

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

由于模式未在浏览器中打开,水豚正确地未通过测试。

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

一种不太可能的可能性是您的资产管道已挂起并且不再将新的 JS 更改合并到在测试模式下提供的文件中。您应该能够使用 rails assets:precompile 强制重新编译,尽管这可能仍然无法获取您资产的未来更改,具体取决于导致挂起的确切原因。在这种情况下,执行 rails assets:clobber 通常会将管道重置为正常工作(可能需要执行 RAILS_ENV=test rails assets:clobber/precompile 以确保正确的事情得到 cleared/built 取决于您的确切设置)