Rspec model sınıfımı görmüyor. başlatılmamış sabit hata


88

Ruby on Rails uygulamasında modellerim için Rspec üzerinde testler yazıyorum. Ve bu hatayı 'rspec spec' başlatılırken alıyorum

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

Rails 4.0.0 ve Ruby 2.0.0 kullanıyorum

İşte benim 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

Ve 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

Ve son olarak client.rb'de (ROR Modeli ve Sınıfı):

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 dosyam yararlı olacaksa:

# 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

Ne benim için çalıştı hattını çıkarmadan oldu --require spec_helperdan .rspec. Zaten içerdiği gibi --require rails_helper, daha sonra yükleniyordu spec_helper.
Yuri Ghensev

Yanıtlar:


91

Dosyanızda spec_helperbazı önemli komutlar eksik. Özellikle, config / environment ve başlatma dahil değildir rspec-rails.

spec/spec_helper.rbDosyanızın başına aşağıdaki satırları ekleyebilirsiniz

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

ya da koşabilirsin

rails generate rspec:install

ve spec_helperkullanım için oluşturulmuş bir tanesinin üzerine yazın rspec-rails.


30
RSpec'in daha yeni sürümleri, bazı şeyleri spec/spec_helper.rbdosyanın dışına taşır , böylece artık bir spec/rails_helper.rbdosya da alırsınız . Çalıştırırsanız rails generate rspec:install, ürettiği şey budur (rspec-rails 3.0.1, rails 4.1.1). Dışarı Dönüşler rails_helper.rbdosyaya sizinkine benzer bazı kod içeren ve size gözlük Rayları yüklemek istediğinizde gerekli olmalıdır.
Dennis

Dennis doğru yolda. Rails yeteneklerini test edecek testler için konfigürasyonunspec_helper.rb içine rails_helper.rb. Ayrıca, rails_helper.rbbu nasıl rspec-railsyapabileceğinden bahseden yorumları okuduğunuzdan emin olun; bu, özellik infer_spec_type_from_file_locationtestlerinizi farklı alt spec/*/dizinlere taşımanıza neden olabilir.
Stephen Henderson

21
spec/rails_helper.rbotomatik olarak dahil etmek istiyorsanız, bunu .rspecekleyerek yapabilirsiniz--require rails_helper
schmijos

3
Ama eklemeden olmaz --require rails_helperüzere .rspeciki yardımcıları ayıran noktasını yenmek. O zaman, Rails'e ihtiyaç duymayan özellikler için bile her zaman rails_helper (ve dolayısıyla Rails) yükleyeceğinizi düşünüyorum.
Jon Garvin

Bu çok yardımcı oldu. Aslında güncellemem .travis.ymlgerekiyordubin/rspec
Peter Ehrlich

156

Raylarda 4.x (rspec-rails 3.1.0) kullanın

require "rails_helper"  # this

değil

require "spec_helper"   # not this

özellik dosyalarınızda


2
Bu, Google’ın amaçları için bir yerde kendi sorusu olmalıdır; Kapibara'nın kırıldığını veya fırlatmanın kırıldığını veya kırıldığını (mücevheri doldurun) düşündüğüm şeyle mücadele ediyordum ve hepsi bu tek satır değişikliğinden kaynaklanıyordu.
EthanK

raylarda "rails_helper" çalışması gerektirir 3.2.22 (rspec-rails 3.2.1)
shilovk

Bu çok kafa karıştırıcıydı. Yeni bir Rails 6 uygulaması oluşturuyorum ve ilk spesifikasyonumu çalıştırıyorum. Kesinlikle rails_helper.rb dosyasını yüklüyordu, ancak şimdi spesifikasyonu çalıştırmayı denedikten sonra yüklemeye çalıştığını görüyorum. require "rails_helper"Spesifikasyonumun üstüne eklendi ve gitmekte iyiydim.
Travis

19

Eklenecek olabilir ayrıca gibi --require rails_helpersizin de .rspecbu gibi görünüyor böylece dosyanın.

--color
--require spec_helper
--require rails_helper

Bundan sonra tüm özelliklerinizde rails_helper gerekmeyecek.


2
Her test için Rails ortamını yüklemeniz gerekiyorsa bu harikadır, ancak değilse bu, sonuçta test paketinizin olması gerekenden daha yavaş olmasına neden olacaktır, bazılarının yukarıdaki başka bir cevaba ilişkin yorumlarda da bahsettiği gibi.
jamesmarkcook

8

Rails 5.0.0.1 kullanıyorum .
İşte bu endişeyi nasıl çözdüğüm.

Gemfile'ınıza lütfen ekleyin -> gem 'rspec-rails', "> = 2.0.0.beta" ekleyin

Bunun gibi

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

Sebep: rspec-rails eklenmezse ve rspec komutunu çalıştırdığınızda, bu hatayı oluşturur -> "böyle bir dosya yükleyemez - rails_helper"

Şimdi, bu komutu terminalde yürütün.

paket yükleme

Bundle komutu iyi gittiğinde, rails oluşturmayı yürütün. Bunun gibi

rails rspec oluşturur: install

Nedeni: bu komut yeni bir .rspec (istendiğinde üzerine yazmayı tıklayın), spec / rails_helper.rb ve spec / spec_helper.rb oluşturacaktır.

Şimdi, bu noktada, rspec hemen hemen düzgün çalışmalıdır.
Bununla birlikte, modelde bulunmayan bir hatayla karşılaşırsanız, örneğin böyle bir dosyayı yükleyemezseniz - fikir , bunu spec / spec_helper.rb dosyanızın üzerine eklemeyi deneyin.

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

Nedeni: spec_helper'ın Rails ortamını yüklemediği anlaşılıyor. Ona ihtiyacımız var.

Bu yardımcı olur umarım!


2

Bu iş parçacığı oluşturulduğundan beri işler biraz değişti, uninitialized constant ClassName (NameError) değişti, Ruby 2.1, Rails 4.2, rspec-rails 3.3 kullanırken hatayı .

Rspec-rails gem belgelerini okuyarak sorunlarımı çözdüm:

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

Swards'ın artık "spec_helper" değil "rails_helper" gerektirmesi konusunda söylediklerini doğruluyor.

Ayrıca benim model spesifikasyonum daha çok mücevher belgelerinden birine benziyor

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

Fabrikalar klasörü uygulamanızda tanımlayın

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

  end
end

Denetleyici RSpec dosyanız:

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

1

Bu sorunun altındaki diğer yanıtlar işe yaramazsa, şunu deneyin:

  • Dosya adında veya sınıf adında herhangi bir yazım hatası olup olmadığını kontrol edin (eşleşmeleri gerekir)

Aksi takdirde,

  • config/environment/test.rbDosyanızı kontrol edin , olup olmadığına bakın config.eager_load = false, olarak ayarlayın true.

Orada yazım hatası düzenleme ile sorunu çözmek istemediğiniz için yazılı sırayı kontrol etmelisiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.