Rspec 没有看到我的模型类。未初始化的常量错误

我在 Ruby on Rails 应用程序中为我的模型编写 Rspec 测试。 我在启动“ rspec spec”时收到这个错误

command:
/spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError)

我使用 Rails 4.0.0和 Ruby 2.0

下面是我的 client _ spec. rb:

require 'spec_helper'




describe Client do


it 'is invalid without first_name', :focus => true do
client = Client.new
client.should_not be_valid
end
end

还有 Gemfile:

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'


# Use sqlite3 as the database for Active Record
gem 'sqlite3'


# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'


# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'


# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'


# gem 'therubyracer', platforms: :ruby


# Use jquery as the JavaScript library
gem 'jquery-rails'


# Turbolinks makes following links in your web application faster. Read more:
gem 'turbolinks'


gem 'jbuilder', '~> 1.0.1'


group :development do
gem 'rspec-rails'
end


group :doc do
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', require: false
end


group :test do
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'database_cleaner'
end

最后,client.rb (ROR 模型和类) :

class Client < ActiveRecord::Base


has_many :cars
has_many :orders
has_one :client_status
has_one :discount_plan, through: :client_status


validates :email, format: { with: /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})\z/, :message => "Only emails allowed", :multiline => true }
validates :email, presence: true, if: "phone.nil?"
#validates :phone, presence: true, if: "email.nil?"
validates :last_name, :first_name, presence: true
validates :last_name, :first_name, length: {
minimum: 2,
maximum: 500,
wrong_length: "Invalid length",
too_long: "%{count} characters is the maximum allowed",
too_short: "must have at least %{count} characters"
}
end

如果它对我的 spec _ helper. rb 文件有用的话:

# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# Require this file using `require "spec_helper"` to ensure that it is only
# loaded once.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
config.treat_symbols_as_metadata_keys_with_true_values = true
config.run_all_when_everything_filtered = true
config.filter_run :focus


# 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'


#config.use_transactional_fixtures = false


config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end


config.before(:each) do
DatabaseCleaner.start
end


config.after(:each) do
DatabaseCleaner.clean
end


end
85613 次浏览

Your spec_helper file is missing some important commands. Specifically, it's not including config/environment and initializing rspec-rails.

You can add the following lines to the start of your spec/spec_helper.rb file

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

or you can just run

rails generate rspec:install

and overwrite your spec_helper with one generated for use with rspec-rails.

In rails 4.x and later (rspec-rails 3.1.0 and later) add this to the top of each of your spec files:

require "rails_helper"  # this

not

require "spec_helper"   # not this

Things have moved a bit since this thread has been created, I have experienced the uninitialized constant ClassName (NameError) error too using Ruby 2.1, Rails 4.2, rspec-rails 3.3.

I have solved my problems reading the rspec-rails gem documentation :

https://github.com/rspec/rspec-rails#model-specs

where it confirms what Swards says about requiring "rails_helper" not "spec_helper" anymore.

Also my model specification looks more like the one from the gem docs

RSpec.describe Url, :type => :model do
it 'is invalid without first_name', :focus => true do
client = Client.new
client.should_not be_valid
end
end

You might also like to add --require rails_helper in your .rspec file so that it looks like this.

--color
--require spec_helper
--require rails_helper

You won't need to require rails_helper in all your specs, after this.

I'm using Rails 5.0.0.1.
Here's how I resolved this concern.

On your Gemfile, please add -> gem 'rspec-rails', ">= 2.0.0.beta"

Like so,

group :development, :test do
gem 'rspec-rails', ">= 2.0.0.beta"
end

Reason: if the rspec-rails is not added and when you execute the rspec command, it will generate this error -> "cannot load such file -- rails_helper"

Now, execute this command on the terminal.

bundle install

Once bundle command went good, execute the rails generate. Like so,

rails generate rspec:install

Reason: this command will create a new .rspec(hit overwrite when prompted), spec/rails_helper.rb and spec/spec_helper.rb

Now, at this point, rspec should pretty much run properly.
However, if you encounter an error where in the model is not found e.g. cannot load such file -- idea, try adding this on top of your spec/spec_helper.rb

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)

Reason: seems that spec_helper is not loading the Rails environment. We're requiring it.

Hope this helps!

Factories folder define in your app

FactoryBot.define do
factory :user_params , :class => 'User' do
username 'Alagesan'
password '$1234@..'


end
end

Your Controller RSpec file:

it 'valid params' do
post :register, params: {:user => user_params }
end

If other answers under this question don't work, try:

  • Check if there is any typo in the file name or class name (they should match)

Other wise,

  • Check your config/environment/test.rb file, see if there is config.eager_load = false, set it to true.

You should check in the written order since you don't want to solve the issue with the typo laying there.

None of the answers above quite hit the nail on the head for me, or weren't quite explicit enough with where lines of code needed to be placed. I'm using rails 6.0.2 and rspec-rails 4.1.0 and found two options that solved the issue.

  1. Add the line require 'rails_helper' to the top of each spec file that you need to run.

  2. Add the line require 'rails_helper' to the top of the spec/spec_helper.rb file to make the rails helper file available in all tests.