Rspec에 내 모델 클래스가 표시되지 않습니다. 초기화되지 않은 상수 오류


88

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.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.
Yuri Ghensev

답변:


91

귀하의 spec_helper파일은 몇 가지 중요한 명령이 없습니다. 특히 config / environment 및 initializing이 포함되지 않습니다 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파일은 당신과 일부 유사한 코드를 포함하고 당신이 당신의 사양에 레일로드 할 때 요구해야한다.
Dennis

Dennis는 올바른 길을 가고 있습니다. 나는 레일 기능을 테스트 할 예정 테스트를 위해 그 구성에서 이동해야합니다 생각 spec_helper.rbrails_helper.rb. 또한, rails_helper.rbhow rspec-railscan 에 대한 주석을 읽으십시오. infer_spec_type_from_file_location그러면 스펙 테스트를 다른 spec/*/하위 디렉토리 로 재배치 할 수 있습니다 .
Stephen Henderson

21
spec/rails_helper.rb자동으로 포함하려면 다음 .rspec을 추가하면됩니다.--require rails_helper
schmijos

3
그러나 두 도우미를 분리하는 요점 --require rails_helper을 무 .rspec찌르기 위해 추가하지는 않습니다 . Rails가 필요하지 않은 사양의 경우에도 항상 rails_helper (따라서 Rails)를로드 할 것이라고 생각합니다.
Jon Garvin 2014

이것은 많은 도움이되었습니다. 나는 실제로 내 업데이트 할 필요 .travis.ymlbin/rspec
피터 에를리히

156

레일 4.x (rspec-rails 3.1.0) 사용

require "rails_helper"  # this

아니

require "spec_helper"   # not this

사양 파일에서


2
이것은 인터넷 검색을 위해 어딘가에있는 자체 질문이어야합니다. 나는 내가 생각했던 카피 바라가 깨 졌거나, 발사가 깨 졌거나, 깨 졌거나 (보석을 채워라) 고군분투 해 왔는데,이 모든 것은이 한 줄 변경 때문이었습니다.
EthanK 2015

레일 3.2.22 (rspec-rails 3.2.1)에서 "rails_helper"작업 필요
shilovk

이것은 매우 혼란 스러웠습니다. 새로운 Rails 6 앱을 만들고 첫 번째 사양을 실행하고 있습니다. 확실히 rails_helper.rb 파일을로드하고 있었지만 이제는 사양을 실행하려고 시도한 후로드하려고했습니다. require "rails_helper"내 사양의 상단에 추가 되었고 나는 잘했다.
Travis

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 명령을 실행하면이 오류가 발생합니다-> "cannot load such file-rails_helper"

이제 터미널에서이 명령을 실행합니다.

번들 설치

번들 명령이 잘되면 rails generate를 실행하십시오. 그렇게

레일은 rspec : install을 생성합니다.

이유 : 이 명령은 새로운 .rspec (메시지가 표시되면 덮어 쓰기), spec / rails_helper.rb 및 spec / spec_helper.rb를 생성합니다.

이제이 시점에서 rspec은 거의 제대로 실행됩니다.
그러나 모델에서 찾을 수없는 오류 (예 : 이러한 파일을로드 할 수 없음 -idea)가 발생하면 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 gem 문서를 읽는 문제를 해결했습니다.

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

Swards가 더 이상 "spec_helper"가 아닌 "rails_helper"를 요구하는 것에 대해 말하는 것을 확인합니다.

또한 내 모델 사양은 gem 문서의 사양과 더 비슷합니다.

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.

오타가있는 문제를 해결하고 싶지 않으니 서면 순서대로 확인하셔야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.