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

时间:2018-02-27 21:14:43

标签: ruby-on-rails selenium testing rspec capybara

我试图在现有的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窗口会打开但我得到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

2 个答案:

答案 0 :(得分:0)

您需要安装gem employee1.update() 。默认情况下,新的rails 5项目已安装,但您的应用程序是在Rails 4中制作的,这就是它没有安装的原因。

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

puma

谷歌搜索此错误导致我this page,这解释了Capybara需要服务器。 添加puma后,我可以在您的应用程序上运行系统测试。

答案 1 :(得分:-2)

这里有很多问题。

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

  2. 永远不要直接对rack_session_access / current_path做出预期,而是使用提供的匹配器,否则您将进行片状测试

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

  3. 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通常会更容易。