在 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.rb
和environments/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
这里有很多问题。
为什么要设置 - config.app_host = 'http://localhost:3000' ???那将 运行 针对您的开发实例而不是测试实例 Capybara 启动的测试。 app_host
只有在进行基于子域的测试时才真正需要设置。这可能是 no route
错误的原因(通常 rack_session_access
只会包含在测试环境中),或者可能是由于没有实际包含 [=12= 中指定的中间件造成的] gem自述文件。
永远不要直接对 current_path
/current_url
做期望,而是使用提供的匹配器,否则你会有不稳定的测试
期待(页面).to have_current_path(users_path)
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 后,我可以 运行 对您的应用程序进行系统测试。
我正在尝试在现有的 Rails 5.1(从 Rails 4 升级)应用程序上使用 Capybara 和 Selenium 设置系统测试,该应用程序已经具有基于水豚的功能测试。这是我到目前为止所做的。
在 group :development, :test
下的 gem 文件中:
gem 'chromedriver-helper'
gem 'selenium-webdriver'
gem 'rack_session_access'
在environments/development.rb
和environments/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
这里有很多问题。
为什么要设置 - config.app_host = 'http://localhost:3000' ???那将 运行 针对您的开发实例而不是测试实例 Capybara 启动的测试。
app_host
只有在进行基于子域的测试时才真正需要设置。这可能是no route
错误的原因(通常rack_session_access
只会包含在测试环境中),或者可能是由于没有实际包含 [=12= 中指定的中间件造成的] gem自述文件。永远不要直接对
current_path
/current_url
做期望,而是使用提供的匹配器,否则你会有不稳定的测试期待(页面).to have_current_path(users_path)
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 后,我可以 运行 对您的应用程序进行系统测试。