Rspec tidak melihat Class model saya. kesalahan konstan yang tidak diinisialisasi

88

Saya menulis tes di Rspec untuk model saya di aplikasi Ruby on Rails. Dan saya menerima kesalahan ini saat memulai 'rspec spec'

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

Saya menggunakan Rails 4.0.0 dan Ruby 2.0.0

Ini client_spec.rb saya:

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

Dan 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

Dan terakhir client.rb (Model dan Kelas 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

Jika akan berguna file spec_helper.rb saya:

# 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
Stan
sumber
Apa yang berhasil bagi saya adalah menghapus garis --require spec_helperdari .rspec. Seperti yang sudah terkandung --require rails_helper, yang dimuat setelahnya spec_helper.
Yuri Ghensev

Jawaban:

91

spec_helperFile Anda kehilangan beberapa perintah penting. Secara khusus, ini tidak termasuk config / environment dan inisialisasi rspec-rails.

Anda dapat menambahkan baris berikut ke awal spec/spec_helper.rbfile Anda

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

atau Anda bisa lari saja

rails generate rspec:install

dan menimpa Anda spec_helperdengan yang dibuat untuk digunakan dengan rspec-rails.

gmacdougall.dll
sumber
30
Versi RSpec yang lebih baru memindahkan beberapa hal dari spec/spec_helper.rbfile, jadi sekarang Anda juga mendapatkan spec/rails_helper.rbfile. Jika Anda menjalankan rails generate rspec:install, inilah yang dihasilkannya (rspec-rails 3.0.1, rails 4.1.1). Ternyata rails_helper.rbfile tersebut berisi beberapa kode yang mirip dengan milik Anda dan harus diperlukan saat Anda ingin memuat Rails dalam spesifikasi Anda.
Dennis
Dennis berada di jalur yang benar. Saya percaya bahwa konfigurasi untuk tes yang akan menguji Rails kemampuan harus dipindahkan dari spec_helper.rbdalam rails_helper.rb. Juga, pastikan untuk membaca komentar dalam rails_helper.rbpenyebutan how rspec-railscan infer_spec_type_from_file_location, yang mungkin membuat Anda merelokasi pengujian spesifikasi Anda ke spec/*/subdirektori yang berbeda .
Stephen Henderson
21
jika Anda ingin memasukkan spec/rails_helper.rbsecara otomatis Anda dapat melakukannya .rspecdengan menambahkan--require rails_helper
schmijos
3
Tapi tidak menambah --require rails_helperuntuk .rspecmengalahkan titik memisahkan dua pembantu. Saya pikir Anda akan selalu memuat rails_helper (dan karenanya Rails), bahkan untuk spesifikasi yang tidak memerlukan Rails.
Jon Garvin
Ini sangat membantu. Saya sebenarnya perlu memperbarui .travis.ymlkebin/rspec
Peter Ehrlich
156

Di rel 4.x (rspec-rails 3.1.0) gunakan

require "rails_helper"  # this

tidak

require "spec_helper"   # not this

di file spesifikasi Anda

Tandai Swardstrom
sumber
2
Ini harus menjadi pertanyaan itu sendiri di suatu tempat untuk tujuan Googling; Saya telah berjuang dengan apa yang saya pikir adalah kapibara rusak, atau launchy rusak, atau rusak (isi permata), dan itu semua karena perubahan satu baris ini.
EthanK
membutuhkan "rails_helper" bekerja pada rel 3.2.22 (rspec-rails 3.2.1)
shilovk
Ini sangat membingungkan. Saya sedang membangun aplikasi Rails 6 baru dan menjalankan spesifikasi pertama saya. Itu pasti memuat file rails_helper.rb, tetapi sekarang saya melihatnya mencoba memuatnya setelah mencoba menjalankan spesifikasi. Ditambahkan require "rails_helper"ke bagian atas spesifikasi saya dan saya siap melakukannya.
Travis
19

Anda mungkin juga ingin menambahkan file --require rails_helperAnda .rspecsehingga terlihat seperti ini.

--color
--require spec_helper
--require rails_helper

Anda tidak perlu membutuhkan rails_helper di semua spesifikasi Anda, setelah ini.

Umang Raghuvanshi
sumber
2
Ini bagus jika Anda perlu memuat lingkungan Rails untuk setiap pengujian, tetapi jika tidak, ini pada akhirnya akan menyebabkan rangkaian pengujian Anda menjadi lebih lambat dari yang seharusnya, seperti yang telah disebutkan beberapa orang dalam komentar di jawaban lain di atas.
jamesmarkcook
8

Saya menggunakan Rails 5.0.0.1.
Inilah cara saya menyelesaikan masalah ini.

Pada Gemfile Anda, tambahkan -> gem 'rspec-rails', "> = 2.0.0.beta"

Seperti itu,

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

Alasan: jika rspec-rails tidak ditambahkan dan ketika Anda menjalankan perintah rspec, ini akan menghasilkan kesalahan ini -> "tidak dapat memuat file seperti itu - rails_helper"

Sekarang, jalankan perintah ini di terminal.

bundel instal

Setelah perintah bundle berjalan dengan baik, jalankan rails generate. Seperti itu,

rel menghasilkan rspec: install

Alasan: perintah ini akan membuat .rspec baru (tekan timpa saat diminta), spec / rails_helper.rb dan spec / spec_helper.rb

Sekarang, pada titik ini, rspec seharusnya berjalan dengan baik.
Namun, jika Anda menemukan kesalahan di mana dalam model tidak ditemukan misalnya tidak dapat memuat file seperti itu - ide , coba tambahkan ini di atas spec / spec_helper.rb Anda

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

Alasan: tampaknya spec_helper tidak memuat lingkungan Rails. Kami membutuhkannya.

Semoga ini membantu!

Kent Aguilar
sumber
2

Banyak hal telah uninitialized constant ClassName (NameError)berubah sejak utas ini dibuat, saya telah mengalami kesalahan juga menggunakan Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Saya telah memecahkan masalah saya dalam membaca dokumentasi permata rspec-rails:

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

yang menegaskan apa yang dikatakan Swards tentang mengharuskan "rails_helper" bukan "spec_helper" lagi.

Juga spesifikasi model saya lebih mirip dengan yang ada di dokumen permata

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
Arnaud Bouchot
sumber
1

Folder pabrik ditentukan di aplikasi Anda

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

  end
end

File Controller RSpec Anda:

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

Jika jawaban lain di bawah pertanyaan ini tidak berhasil, coba:

  • Periksa apakah ada kesalahan ketik pada nama file atau nama kelas (harus cocok)

Jika tidak,

  • Periksa config/environment/test.rbfile Anda , lihat apakah ada config.eager_load = false, setel ke true.

Anda harus memeriksa dalam urutan tertulis karena Anda tidak ingin menyelesaikan masalah dengan kesalahan ketik yang ada di sana.

Longfei Wu
sumber