【问题标题】:minitest/capybara error - NameError: undefined local variable or method 'page'minitest/capybara 错误 - NameError:未定义的局部变量或方法“页面”
【发布时间】:2021-02-04 11:15:19
【问题描述】:

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

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

  • minitest 从 5.11.3 到 5.14.3
  • 水豚从 1.1.2 到 2.18.0
  • 应该从 1.0.0 到 2.1.0 的匹配器
  • 应该从 1.0.0 到 1.2.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

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

我的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.2 capybara minitest testunit ruby-2.7


    【解决方案1】:

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

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

    【讨论】:

    • 有问题的测试正在扩展ActionController::TestCase,所以我将其更改为ActionDispatch::IntegrationTest,现在它失败并出现错误undefined method respond_with。是的,2.7 有很多弃用警告,但我们现在正在压制它们(直到我们能够更新 Rails)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2016-04-08
    相关资源
    最近更新 更多