我试图在现有的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窗口会打开但我得到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
答案 0 :(得分:0)
您需要安装gem employee1.update()
。默认情况下,新的rails 5项目已安装,但您的应用程序是在Rails 4中制作的,这就是它没有安装的原因。
这是为什么?好吧,如果你要进行捆绑更新(并且我承认我无法解释原因),那么在尝试运行规范时会出现此错误,这更具说明性:
puma
谷歌搜索此错误导致我this page,这解释了Capybara需要服务器。 添加puma后,我可以在您的应用程序上运行系统测试。
答案 1 :(得分:-2)
这里有很多问题。
你为什么要设置 - config.app_host =' http://localhost:3000' ???这将针对您的开发实例运行测试,而不是测试实例Capybara启动。如果您正在进行基于子域的测试,那么app_host
真的应该只需要设置。这可能是no route
错误的原因(通常rack_session_access
只会包含在测试环境中),或者可能是因为实际上没有包含{{1}中指定的中间件宝石自述。
永远不要直接对rack_session_access
/ current_path
做出预期,而是使用提供的匹配器,否则您将进行片状测试
期望(页面).to have_current_path(users_path)
current_url
只是page
的别名,是Capybara :: DSL模块的成员。如果它在您的测试范围内不可用,则很可能意味着Capybara :: DSL不包含在内。这通常由Capybara.current_session
- https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/vendor/capybara.rb#L21完成 - 因此您可能无法将测试类型设置为系统'。如果您的spec_helper方法无法使用它,那么仅使用rspec-rails
通常会更容易。