首页 > 解决方案 > minitest/capybara 错误 - NameError: undefined local variable or method 'page'

问题描述

我正在更新 Rails 3.2 LTS 项目的托管,将它们从 ruby​​ 2.3.3 升级到 2.7.2。

作为其中的一部分,我更新了一些宝石,特别是更新

我提到所有这些,因为我现在有两个失败的测试,它们在更改之前通过了。

Error: test_: as a logged in user who has picked a location with an existing current visit when requesting the edit visit page should show the clinical coronal balance section. (VisitsControllerTest): NameError: undefined local variable or method `page' for #<VisitsControllerTest:0x0000558981845048>
test/functional/visits_controller_test.rb:97:in `block (4 levels) in <class:VisitsControllerTest>'
test/functional/visits_controller_test.rb:109:in `instance_exec'
test/functional/visits_controller_test.rb:109:in `block in create_test_from_should_hash'

Error: test_: as a logged in user who has picked a location with an existing current visit when requesting the edit visit page should show the clinical sagittal balance section. (VisitsControllerTest): NameError: undefined local variable or method `page' for #<VisitsControllerTest:0x0000558981844dc8>
test/functional/visits_controller_test.rb:122:in `block (4 levels) in <class:VisitsControllerTest>'
test/functional/visits_controller_test.rb:134:in `instance_exec'
test/functional/visits_controller_test.rb:134:in `block in create_test_from_should_hash'

它们都指向同一个文件中的两个测试,看起来像这样

should "show the clinical coronal balance section" do
  assert page.has_table? 'clinicalassessment'
  assert page.has_selector? 'td', :text => "Coronal Balance\n(mm)", :count => 1
  assert page.has_selector? 'td', :text => 'S1-T1 (Global)', :count => 2
  assert page.has_field? 'clinical_assessment_permutation_with_brace_pre_adjustment_coronal_balance_global_negative', :count => 1
  # snip
end

should "show the clinical sagittal balance section" do
  assert page.has_table? 'clinicalassessment'
  assert page.has_selector? 'td', :text => "Sagittal Offset\n(mm)", :count => 1
  assert page.has_selector? 'td', :text => "Wall to Foot Template", :count => 1
  assert page.has_selector? 'td', :text => "Wall to S1", :count => 1
  assert page.has_selector? 'td', :text => "Wall to T1", :count => 2 # this matches T1        
  # snip
end

如前所述,这个测试之前通过了,所以我猜其中一个宝石发生了一些变化,但我不知道是什么,或者如何修复它。

我的test_helper.rb文件在下面

ENV["RAILS_ENV"] = "test"
require 'minitest/autorun'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'sidekiq/testing/inline'
require 'capybara/rails'
require 'capybara/minitest'

User.work_factor = 4

class ActiveSupport::TestCase
  include ActionDispatch::TestProcess
  self.use_transactional_fixtures = true
  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  # Add more helper methods to be used by all tests here...
  # raise "remove workaround" if Shoulda::VERSION > "2.11.3"
  unless defined?(Test::Unit::AssertionFailedError)
    class Test::Unit::AssertionFailedError < ActiveSupport::TestCase::Assertion
    end
  end

  def assert_false(expected_to_be_false, message = "")
    assert !expected_to_be_false, message
  end

  alias deny assert_false
end

class ActionDispatch::IntegrationTest
  # Make the Capybara DSL available in all integration tests
  include Capybara::DSL
  # Make `assert_*` methods behave like Minitest assertions
  include Capybara::Minitest::Assertions

  # Reset sessions and driver between tests
  # Use super wherever this method is redefined in your individual test classes
  def teardown
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end
end

class Minitest::Test
  def page
    Capybara::Node::Simple.new(@response.body)
  end
end

require 'mocha/setup'

谢谢你。

标签: ruby-on-rails-3.2capybaraminitesttestunitruby-2.7

解决方案


您将 Capybara::DSL 包含到 ActionDispatch::IntegrationTest 中,这应该page在从该类派生的任何测试中可用。由于您得到的page是未定义的,这意味着这些测试是从哪个类派生的(您的问题中没有显示)不是 ActionDispatch::IntegrationTest

附带说明 - 如果 Capybara 2.18 对 Ruby 2.7 没有一些问题(至少有大量警告),我会感到惊讶


推荐阅读