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файлі відсутні деякі важливі команди. Зокрема, це не включає конфігурацію / середовище та ініціалізацію 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.


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
Пітер Ерліх

155

У рейках 4.x (rspec-rails 3.1.0) використовувати

require "rails_helper"  # this

ні

require "spec_helper"   # not this

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


2
Це має бути власне запитання десь для цілей гуглювання; Я боровся з тим, що, на мою думку, було зламаною Капібарою, або зламаною ракетою, або зламаною (заповніть самоцвіт), і все це відбулося завдяки цій одній зміні рядка.
EthanK

вимагають роботи "rails_helper" на рейках 3.2.22 (rspec-rails 3.2.1)
shilovk

Це надзвичайно заплутало. Я будую новий додаток 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 генерують 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.

Я вирішив свої проблеми з читанням документації до самоцвіту rspec-rails:

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

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.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.