在 Rails 5.1 应用程序(从 Rails 4 升级)上使用 Capybara 和 Selenium 的系统测试设置问题

Issues with system test setup using Capybara and Selenium on Rails 5.1 app (upgraded from Rails 4)

我正在尝试在现有的 Rails 5.1(从 Rails 4 升级)应用程序上使用 Capybara 和 Selenium 设置系统测试,该应用程序已经具有基于水豚的功能测试。这是我到目前为止所做的。

group :development, :test 下的 gem 文件中:

gem 'chromedriver-helper'  
gem 'selenium-webdriver'
gem 'rack_session_access'

environments/development.rbenvironments/test.rb中:

config.action_mailer.default_url_options = { host: 'localhost:3000' } 

spec\rails_helper.rb中:

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.configure do |config|
  config.default_max_wait_time = 10 # seconds
  config.default_driver = :selenium
  config.app_host = 'http://localhost:3000'
  config.server_host = 'localhost'
end

我遇到的问题是新系统测试和旧功能测试。

通过系统测试,我发现 Capybara 似乎没有创建页面对象 undefined local variable or method 'page' 此外,当我在功能测试目录下复制相同的测试时,我没有遇到这个问题。

使用旧的 Capybara 功能测试,使用 rackTest 驱动程序,Chrome window 打开,但我得到 No route matches [GET] "/rack_session/edit"

config.middleware.use RackSessionAccess::Middleware 已经存在于 environments/test.rb

示例系统测试:

require 'rails_helper'

describe User do
  let(:user) { create :user }
  let(:membership) { create :membership, admin: true}
  let(:admin) { create :user, memberships: [membership] }

  context 'viewing the index' do
    it 'directs you to the appropriate page' do
      set_current_user(admin)
      visit root_url
      click_button 'Manage Users'
      expect(page.current_url).to end_with users_path
      expect(page).to have_selector 'h1', text: 'Users'
    end
  end
end

示例功能测试:

require 'rails_helper'

describe 'edit an assignment' do
  let(:roster) { create :roster }
  let(:user) { create :user, rosters: [roster] }
  before :each do
    Timecop.freeze Date.new(2018, 1, 10)
    set_current_user(user)
  end
  after :each do
    Timecop.return
  end

  context 'returns the user to the appropriate index page' do
    let(:date_today) { Date.new(2017, 4, 4) }
    let(:start_date) { Date.new(2017, 3, 31) }
    let(:month_date) { date_today.beginning_of_month }
    it 'redirects to the correct URL' do
      visit roster_assignments_url(roster, date: date_today)
      visit new_roster_assignment_url(roster, date: start_date)
      click_button 'Create'
      expect(current_url)
        .to eq roster_assignments_url(roster,
                                      date: month_date)
    end

spec_helper中:

def set_current_user(user)
  page.set_rack_session user_id: user.id
end

这里有很多问题。

  1. 为什么要设置 - config.app_host = 'http://localhost:3000' ???那将 运行 针对您的开发实例而不是测试实例 Capybara 启动的测试。 app_host 只有在进行基于子域的测试时才真正需要设置。这可能是 no route 错误的原因(通常 rack_session_access 只会包含在测试环境中),或者可能是由于没有实际包含 [=12= 中指定的中间件造成的] gem自述文件。

  2. 永远不要直接对 current_path/current_url 做期望,而是使用提供的匹配器,否则你会有不稳定的测试

    期待(页面).to have_current_path(users_path)

  3. page 只是 Capybara.current_session 的别名,是模块 Capybara::DSL 的成员。如果它在您的测试范围内不可用,则很可能意味着 Capybara::DSL 未包含在内。这通常由 rspec-rails - https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/vendor/capybara.rb#L21 完成 - 因此您可能实际上没有将测试类型设置为 'system'。如果它在您的 spec_helper 方法中不可用,通常使用 Capybara.current_session 会更容易。

您需要安装 gem puma。新 rails 5 个项目默认安装了它,但您的应用程序是在 Rails 4 中制作的,这就是它没有安装的原因。

这是为什么?好吧,如果你要进行捆绑更新(我承认我无法解释原因),你会在尝试 运行 规范时遇到此错误,这更具解释性:

System test integration requires Rails >= 5.1 and has a hard dependency on a webserver and `capybara`, please add capybara to your Gemfile and configure a webserver (e.g. `Capybara.server = :webrick`) before attempting to use system tests.

谷歌搜索这个错误让我找到 this page,这说明 Capybara 需要一个服务器。 添加 puma 后,我可以 运行 对您的应用程序进行系统测试。