Rspec не видит мой модельный класс. неинициализированная постоянная ошибка
Я пишу тесты на Rspec для своих моделей в приложении Ruby on Rails.
И я получаю эту ошибку при запуске 'rspec spec'
command:
/spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError)
Я использую Rails 4.0.0 и Ruby 2.0.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
И наконец клиент .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
Ответы
Ответ 1
В вашем файле spec_helper
отсутствуют некоторые важные команды. В частности, он не включает конфигурацию/среду и инициализацию rspec-rails
.
Вы можете добавить следующие строки в начало вашего spec/spec_helper.rb
файла
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
или вы можете просто запустить
rails generate rspec:install
и перезапишите свой spec_helper
одним сгенерированным для использования с rspec-rails
.
Ответ 2
В рельсах 4.x(rspec-rails 3.1.0) используйте
require "rails_helper" # this
не
require "spec_helper" # not this
в ваших файлах спецификаций
Ответ 3
Вы также можете добавить --require rails_helper
в свой .rspec
файл, чтобы он выглядел следующим образом.
--color
--require spec_helper
--require rails_helper
После этого вам не нужно будет запрашивать rails_helper во всех ваших спецификациях.
Ответ 4
Я использую Rails 5.0.0.1.
Вот как я решил эту проблему.
В своем Gemfile добавьте → gem 'rspec-rails', " >= 2.0.0.beta"
Таким образом,
group :development, :test do
gem 'rspec-rails', ">= 2.0.0.beta"
end
Причина:, если rspec-rails не добавляется, и когда вы выполняете команду rspec, она будет генерировать эту ошибку → "не может загрузить такой файл - rails_helper"
Теперь выполните эту команду на терминале.
установить пакет
После того, как команда bundle пошла хорошо, выполните генерации рельсов. Таким образом,
rails создает rspec: install
Причина: эта команда создаст новый .rspec(ударит перезапись при появлении запроса), spec/rails_helper.rb и spec/spec_helper.rb
Теперь, в этот момент, rspec должен в значительной степени работать должным образом.
Однако, если вы столкнулись с ошибкой, когда в модели не найдено, например. не может загрузить такой файл - идею, попробуйте добавить это поверх своего spec/spec_helper.rb
require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
Причина: кажется, что spec_helper не загружает среду Rails. Мы требуем этого.
Надеюсь, это поможет!
Ответ 5
С тех пор, как этот поток был создан, ситуация немного изменилась. Я также испытал ошибку uninitialized constant ClassName (NameError)
, используя Ruby 2.1, Rails 4.2, rspec-rails 3.3.
Я решил свои проблемы, прочитав документацию gspec-rails gem:
https://github.com/rspec/rspec-rails#model-specs
где он подтверждает, что Swards говорит о необходимости "rails_helper", а не "spec_helper".
Кроме того, моя спецификация модели больше похожа на ту, что была из 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
Ответ 6
В вашем приложении определяется папка "Фабрики"
FactoryBot.define do
factory :user_params , :class => 'User' do
username 'Alagesan'
password '[email protected]'
end
end
Файл RSpec вашего контроллера:
it 'valid params' do
post :register, params: {:user => user_params }
end
Ответ 7
если другие ответы по этому вопросу не работают, попробуйте: - посмотрите, есть ли опечатка в имени файла или имени класса (они должны совпадать). В файле config/environment/test.rb
найдите config.eager_load = false
, установите значение true
.