Rspec не видит мой класс модели. неинициализированная постоянная ошибка

86

Я пишу тесты на 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

И наконец 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
Стэн
источник
Что сработало для меня, так это удаление линии --require spec_helperиз .rspec. Поскольку он уже содержал --require rails_helper, который потом загружался spec_helper.
Юрий Генсев

Ответы:

91

В вашем spec_helperфайле отсутствуют некоторые важные команды. В частности, он не включает config / environment и инициализацию 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.

Gmacdougall
источник
30
Более новые версии RSpec перемещают некоторые вещи из spec/spec_helper.rbфайла, так что теперь вы также получаете spec/rails_helper.rbфайл. Если вы запустите rails generate rspec:install, это то, что он производит (rspec-rails 3.0.1, rails 4.1.1). Оказывается, rails_helper.rbфайл содержит код, похожий на ваш, и должен потребоваться, когда вы хотите загрузить Rails в свои спецификации.
Деннис
Деннис на правильном пути. Я считаю, что конфигурацию тестов, которые будут проверять возможности Rails, следует перенести из spec_helper.rbв rails_helper.rb. Также не забудьте прочитать комментарии в rails_helper.rbэтом упоминании о том , как rspec-railsможно infer_spec_type_from_file_location, что может заставить вас переместить свои тесты спецификации в разные spec/*/подкаталоги.
Стивен Хендерсон
21
если вы хотите включить spec/rails_helper.rbавтоматически, вы можете сделать это в своем .rspec, добавив--require rails_helper
schmijos
3
Но не добавляет, --require rails_helperчтобы .rspecпобедить точку разделения двух помощников. Я думаю, тогда вы всегда будете загружать rails_helper (и, следовательно, Rails), даже для тех спецификаций, которые не нуждаются в Rails.
Джон Гарвин
Это очень помогло. Мне действительно нужно было обновить мое .travis.ymlдоbin/rspec
Питер Эрлих
156

В рельсах 4.x (rspec-rails 3.1.0) используйте

require "rails_helper"  # this

не

require "spec_helper"   # not this

в ваших файлах спецификации

Марк Свардстрем
источник
2
Это должен быть его собственный вопрос где-то в целях поиска в Google; Я боролся с тем, что, как мне казалось, было сломанной капибарой, или сломанной, или сломанной (заполните драгоценный камень), и все это было из-за этого одного изменения строки.
EthanK,
требуется "rails_helper" работать на рельсах 3.2.22 (rspec-rails 3.2.1)
shilovk 05
Это было очень запутанно. Я создаю новое приложение Rails 6 и запускаю свою первую спецификацию. Он определенно загружал файл rails_helper.rb, но теперь я вижу, что он пытался загрузить его после попытки запустить спецификацию. Добавлен require "rails_helper"в верхнюю часть моей спецификации, и я был готов.
Трэвис
19

Вы также можете добавить --require rails_helperв свой .rspecфайл, чтобы он выглядел так.

--color
--require spec_helper
--require rails_helper

После этого вам не нужно будет требовать rails_helper во всех ваших спецификациях.

Уманг Рагхуванши
источник
2
Это замечательно, если вам нужно загружать среду Rails для каждого теста, но в противном случае это в конечном итоге приведет к тому, что ваш набор тестов будет медленнее, чем нужно, как некоторые упоминали в комментариях к другому ответу выше.
jamesmarkcook
8

Я использую 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 generate. Вот так,

рельсы генерируют 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. Нам это нужно.

Надеюсь это поможет!

Кент Агилар
источник
2

С момента создания этой темы все немного изменилось, я испытал uninitialized constant ClassName (NameError) изменилось ошибкой, используя Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Я решил свои проблемы, читая документацию по gem rspec-rails:

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

где он подтверждает то, что Swards говорит о том, что больше не требуется "rails_helper", а не "spec_helper".

Также моя спецификация модели больше похожа на ту из документации по драгоценным камням.

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
Арно Бушо
источник
1

Папка фабрик определите в вашем приложении

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

  end
end

Ваш файл контроллера RSpec:

it 'valid params' do
  post :register, params: {:user => user_params } 
end
Бубалан
источник
1

Если другие ответы на этот вопрос не работают, попробуйте:

  • Проверьте, нет ли опечаток в имени файла или имени класса (они должны совпадать)

В противном случае,

  • Проверьте свой config/environment/test.rbфайл, посмотрите, есть ли там config.eager_load = false, установите для него значение true.

Вы должны проверить в письменном порядке, так как вы не хотите решать проблему с опечаткой.

Лунфэй Ву
источник