Daniel Hollands
Daniel Hollands

Reputation: 6671

minitest/capybara error - NameError: undefined local variable or method 'page'

I'm in the process of updating the hosting for a Rails 3.2 LTS project, taking them from ruby 2.3.3 to 2.7.2.

As part of this I've updated a few gems, specifically updating

I mention all this, because I've now got two failing tests, which were passing before the changes.

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'

These are both pointing to two tests within the same file, which look like this

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

As mentioned, this test was passing before, so I'd guess something has changed in one of the gems, but I don't know what, or how to fix it.

My test_helper.rb file is below

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'

Thank you.

Upvotes: 1

Views: 549

Answers (1)

Thomas Walpole
Thomas Walpole

Reputation: 49870

You're including Capybara::DSL into ActionDispatch::IntegrationTest which should make page available in any tests derived from that class. Since you're getting that page is undefined it would imply that whatever class those tests are derived from (it's not shown in your question) is not ActionDispatch::IntegrationTest

On a side note - I would be surprised if Capybara 2.18 doesn't have some issues with Ruby 2.7 (at the very least a ton of warnings)

Upvotes: 1

Related Questions