Rodras Rodras - 4 months ago 38
Ruby Question

RSPEC Can't find Controllers Uninitialized Constants

I recently started adding tests to my app and I am facing some issues regarding the controllers tests. When I try to run any controller test I get this error:

-> bundle exec rspec -c -b spec/controllers/culture_test_controller_spec.rb
ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations".* FROM "schema_migrations"
/home/rodras/Github/talentank/spec/controllers/culture_test_controller_spec.rb:4:in `<top (required)>': uninitialized constant CultureTestController (NameError)


The strange thing is that all the models tests seem to be working fine, that is why I assume that the issue is not in
rails_helper.rb
nor in
spec_helper.rb


I have already check questions that seemed to have the same problem such as: RSpec Cannot find my Controllers Uninitialized Constant but the solutions offered there didn't help me

These are my files. If there is any other file that you need in order solve the question please let me know, and I will update the question.

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'
require 'shoulda/matchers'
# 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"
config.include FactoryGirl::Syntax::Methods

# 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
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end


spec_helper.rb

require File.expand_path("../../config/environment", __FILE__)
# 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

# For using same seed as development environment
config.before(:all) do
#load Rails.root + "db/seeds.rb"
Rails.application.load_seed # loading seeds
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


One of my controller tests: spec/controllers/culture_test_controller_spec.rb

require 'rails_helper'
require 'rspec/its'

RSpec.describe CultureTestController, type: :controller do
describe "GET #index" do
it "returns a specific culture test" do
culture_test = FactoryGirl(:culture_test)
get :index
expect(response).to render_text(:culture_test)
end
it "returns all the culture tests" do
culture_test = FactoryGirl(:invalid_culture_test)
get :index
expect(response).to render_text(CultureTest.all)
end

end

end


The respective controller: culture_test_controller.rb

module Api
class CultureTestController < ApplicationController
before_action :find_culture_test, only: [:show, :edit, :update, :registration, :results]

def index
if(params[:company_id] != nil && params[:title] != nil)
respond_to do |format|
format.json{
render text: CultureTest.where(:company_id => params[:company_id]).where(:title => params[:title]).first.to_json
}
end
else
respond_to do |format|
format.json{
render text: CultureTest.all.to_json
}
end
end
end


Gemfile:

source 'https://rubygems.org'

ruby "2.1.3"

### APP DEFAULT GEMS
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
gem 'sprockets', '2.12.3'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
# Removed so that we can use AngularJS
# gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
gem 'responders'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
# Bower package manager
gem 'bower-rails'
gem 'rails-html-sanitizer'


### FRONT-END STUFF
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Using the jQuery UI framework
gem 'jquery-ui-rails'
# And some nice jQuery gems
gem 'jquery-validation-rails'
gem 'jquerymobile-rails'
# Talentank's front-end devs prefer haml over erb
gem 'haml'
# Zurb's Foundation as HTML+CSS framework
gem 'foundation-rails'
# We want to use the Foundation icons too
gem 'foundation-icons-sass-rails'
# Font Awesome: awesome icons
gem "font-awesome-rails"
# Animate.css as a Rails gem (simple CSS animations)
gem 'animate-rails'
# EU cookies law
gem 'cookies_eu'
# Angular templates for simple Angular templates as asset referencing
gem 'angular-rails-templates'
# Gem for authenticate with protection token
gem 'angular_rails_csrf'


### BACK-END STUFF
# let's use PostgreSQL. Yay!
gem 'pg'
# let's get rid of that webrick crap
gem "puma"
# Devise as user authenticator and session management
gem 'devise'
# gem 'devise_token_auth' # Token based authentication for Rails JSON APIs
# gem 'omniauth' # required for devise_token_auth
# Paperclip allows us to attach files (such as logos in company profiles)
gem 'paperclip'
# i18n for internationalization (app translation)
gem 'i18n'
gem 'i18n-js'
# Globalize is used to translate the database
gem 'globalize'
# Simple_form for, guess what, simple forms
gem 'simple_form'
# Allows country selection in simple form
gem 'country_select'
# mail_form for simple, yet nice contact forms
gem 'mail_form'


### DEVOPS STUFF (anything related to the logistics of deploying the app)
# rails_12factor has to do with Heroku and devops
gem 'rails_12factor'
# yaml_db: db migrations to heroku
gem 'yaml_db'

# Backend for working in background
gem 'delayed_job_active_record'

# To run jobs
gem 'daemons'


group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'

# Access an IRB console on exception pages or by using <%= console %> in views
gem 'web-console', '~> 2.0'

# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'

gem 'rspec-rails'
gem 'rspec-its'
gem 'shoulda-matchers', require: false# Helps with the test models with belongs_to and has_many
# Fuubar formats RSpec output in a nice way
# gem 'fuubar'
#FactoryGirl is a library for setting up Ruby objects as test data.
gem 'factory_girl_rails'
#Faker for creating fake dummy fields
gem 'faker'

gem 'mailcatcher'

end

Answer

I think the problem might be here

spec/controllers/culture_test_controller_spec.rb

RSpec.describe CultureTestController, type: :controller do

It should be:

RSpec.describe Api::CultureTestController, type: :controller do