如何解决minitest/capybara 错误 - NameError:未定义的局部变量或方法“页面”
我正在更新 Rails 3.2 LTS 项目的托管,将它们从 ruby 2.3.3 升级到 2.7.2。
作为其中的一部分,我更新了一些 gem,特别是更新
- 从 5.11.3 到 5.14.3 的 minitest
- 水豚从 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)",:text => "Wall to Foot Template",:text => "Wall to S1",: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'
谢谢。
解决方法
您将 Capybara::DSL 包含到 ActionDispatch::IntegrationTest 中,这将使 page
在派生自该类的任何测试中可用。由于您得到 page
未定义,这意味着这些测试派生自的任何类(它未显示在您的问题中)都不是 ActionDispatch::IntegrationTest
附带说明 - 如果 Capybara 2.18 与 Ruby 2.7 没有一些问题(至少有大量警告),我会感到惊讶
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。