【问题标题】:Issues with system test setup using Capybara and Selenium on Rails 5.1 app (upgraded from Rails 4)使用 Capybara 和 Selenium on Rails 5.1 应用程序(从 Rails 4 升级)的系统测试设置问题
【发布时间】:2018-08-07 15:41:13
【问题描述】:

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

在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

【问题讨论】:

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


    【解决方案1】:

    您需要安装 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 后,我可以在您的应用程序上运行系统测试。

    【讨论】:

    • 我的 gemfile 中有 puma 和 Capybara.server = :puma,我看到了这个错误。
    • 我不认为手动将 Capybara 服务器设置为 puma 是必要的,因为它是默认设置。在你的 spec/rails helper 中你是如何要求 Capybara 的?
    【解决方案2】:

    这里有很多问题。

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

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

      期望(page).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 完成 - 所以您可能实际上没有将测试类型设置为“系统”。如果它在您的 spec_helper 方法中不可用,则使用 Capybara.current_session 通常更容易。

    【讨论】:

    • 1.我不得不说设置config.app_host = 'http://localhost:3000' 有点像我在某处读到的创可贴解决方案。然而,Capybara 启动的测试实例似乎无法正常工作。浏览器将循环浏览由示例域@example.com、更新机架会话和机架会话数据@localhost 组成的三个页面。 2. 我会调查的。 3. 这解决了我的页面问题,但我现在收到了undefined local variable or method 'root_url' 链接。
    • @Voxorin - 我不明白“浏览器将循环浏览三个页面......”的意思 - 除非您的测试或页面告诉它,否则浏览器不会做任何事情做一点事。尝试访问xxx_path 而不是xxx_url,看看是否会改变你的情况。
    • 对,我的设置有问题。 Selenium 打开一个浏览器,Capybara 创建了一个对我来说看起来像核心示例的页面。然后,当测试尝试运行带有输入框的机架会话更新页面时,会显示机架会话数据页面。这是否也与 Capybara::DSL 有关系
    • @Voxorin 不,如果您没有收到任何方法错误,那只会是 Capybara::DSL 问题。我猜 rack_session 页面是当您调用 set_rack_session(通过 set_current_user)时出现的,尽管我不能 100% 确定这一点,因为我不使用那个 gem。您是否尝试在 visit 通话中切换到 xxx_path 而不是 xxx_url??
    • 至于undefined local variable or method 'root_url',那是因为 ``Rails.application.routes.url_helper` 不包含在您尝试调用 root_url 的任何范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多