Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSpec Cannot find my Controllers Uninitialized Constant

Tags:

My rails app recently moved from Rails 3 to Rails 4 and I've been trying to run rspec on individual specs (controllers, models, etc.) and it seems to be having an issue actually locating the object. For example, when I try to run the following code it errors with an uninitialized constant error. This seems to be happening for multiple controllers. I've already tried deleting the rails_helper.rb and spec_helper.rb and running rails generate rspec:install but it doesn't seem to resolve the error. Why can't it find the controllers?

What I'm Trying to execute

-> rspec spec/controllers/activity_controller_spec.rb  /Users/osx_user/rails_projects/tealeaf_rails/ltbweb/spec/controllers/activity_controller_spec.rb:4:in `<top (required)>': uninitialized constant ActivitiesController (NameError) 

rails_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require 'spec_helper' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point!  # Requires supporting ruby files with custom matchers and macros, etc, in # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are # run as spec files by default. This means that files in spec/support that end # in _spec.rb will both be required and run as specs, causing the specs to be # run twice. It is recommended that you do not name files matching this glob to # end with _spec.rb. You can configure this pattern with the --pattern # option on the command line or in ~/.rspec, .rspec or `.rspec-local`. # # The following line is provided for convenience purposes. It has the downside # of increasing the boot-up time by auto-requiring all files in the support # directory. Alternatively, in the individual `*_spec.rb` files, manually # require only the support files necessary. # # Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }  # Checks for pending migrations before tests are run. # If you are not using ActiveRecord, you can remove this line. ActiveRecord::Migration.maintain_test_schema!  RSpec.configure do |config|   # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures   config.fixture_path = "#{::Rails.root}/spec/fixtures"    # If you're not using ActiveRecord, or you'd prefer not to run each of your   # examples within a transaction, remove the following line or assign false   # instead of true.   config.use_transactional_fixtures = true    # RSpec Rails can automatically mix in different behaviours to your tests   # based on their file location, for example enabling you to call `get` and   # `post` in specs under `spec/controllers`.   #   # You can disable this behaviour by removing the line below, and instead   # explicitly tag your specs with their type, e.g.:   #   #     RSpec.describe UsersController, :type => :controller do   #       # ...   #     end   #   # The different available types are documented in the features, such as in   # https://relishapp.com/rspec/rspec-rails/docs   config.infer_spec_type_from_file_location! end 

spec_helper.rb

# This file was generated by the `rails generate rspec:install` command. Conventionally, all # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. # The generated `.rspec` file contains `--require spec_helper` which will cause this # file to always be loaded, without a need to explicitly require it in any files. # # Given that it is always loaded, you are encouraged to keep this file as # light-weight as possible. Requiring heavyweight dependencies from this file # will add to the boot time of your test suite on EVERY test run, even for an # individual file that may not need all of that loaded. Instead, consider making # a separate helper file that requires the additional dependencies and performs # the additional setup, and require it from the spec files that actually need it. # # The `.rspec` file also contains a few flags that are not defaults but that # users commonly want. # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration RSpec.configure do |config|   # rspec-expectations config goes here. You can use an alternate   # assertion/expectation library such as wrong or the stdlib/minitest   # assertions if you prefer.   config.expect_with :rspec do |expectations|     # This option will default to `true` in RSpec 4. It makes the `description`     # and `failure_message` of custom matchers include text for helper methods     # defined using `chain`, e.g.:     # be_bigger_than(2).and_smaller_than(4).description     #   # => "be bigger than 2 and smaller than 4"     # ...rather than:     #   # => "be bigger than 2"     expectations.include_chain_clauses_in_custom_matcher_descriptions = true   end    # rspec-mocks config goes here. You can use an alternate test double   # library (such as bogus or mocha) by changing the `mock_with` option here.   config.mock_with :rspec do |mocks|     # Prevents you from mocking or stubbing a method that does not exist on     # a real object. This is generally recommended, and will default to     # `true` in RSpec 4.     mocks.verify_partial_doubles = true   end  # The settings below are suggested to provide a good initial experience # with RSpec, but feel free to customize to your heart's content. =begin   # These two settings work together to allow you to limit a spec run   # to individual examples or groups you care about by tagging them with   # `:focus` metadata. When nothing is tagged with `:focus`, all examples   # get run.   config.filter_run :focus   config.run_all_when_everything_filtered = true    # Limits the available syntax to the non-monkey patched syntax that is recommended.   # For more details, see:   #   - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax   #   - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/   #   - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching   config.disable_monkey_patching!    # Many RSpec users commonly either run the entire suite or an individual   # file, and it's useful to allow more verbose output when running an   # individual spec file.   if config.files_to_run.one?     # Use the documentation formatter for detailed output,     # unless a formatter has already been configured     # (e.g. via a command-line flag).     config.default_formatter = 'doc'   end    # Print the 10 slowest examples and example groups at the   # end of the spec run, to help surface which specs are running   # particularly slow.   config.profile_examples = 10    # Run specs in random order to surface order dependencies. If you find an   # order dependency and want to debug it, you can fix the order by providing   # the seed, which is printed after each run.   #     --seed 1234   config.order = :random    # Seed global randomization in this process using the `--seed` CLI option.   # Setting this allows you to use `--seed` to deterministically reproduce   # test failures related to randomization by passing the same `--seed` value   # as the one that triggered the failure.   Kernel.srand config.seed =end end 
like image 425
Solomons_Ecclesiastes Avatar asked Oct 09 '14 21:10

Solomons_Ecclesiastes


1 Answers

I added

require File.expand_path("../../config/environment", __FILE__)

to the spec_helper.rb file and this resolved the error. I'm not sure why the spec_helper needs this, but I think it has something to do with Rails' ability to locate a file's path relative to another file, and I suspect this was messing up RSpec's ability to find the appropriate controllers, models, etc.

I did some research and found that previously we were on RSpec 2.14 and we're now on 3.2, and I think there may be some differences in the way rspec uses these two files. In our old spec_helper file we had this line:

require File.expand_path("../../config/environment", __FILE__)

like image 197
Solomons_Ecclesiastes Avatar answered Oct 09 '22 13:10

Solomons_Ecclesiastes