Rspec không thấy Lớp mô hình của tôi. lỗi liên tục chưa được khởi tạo


86

Tôi đang viết các bài kiểm tra trên Rspec cho các mô hình của tôi trong ứng dụng Ruby on Rails. Và tôi nhận được lỗi này khi khởi động 'rspec spec'

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

Tôi sử dụng Rails 4.0.0 và Ruby 2.0.0

Đây là client_spec.rb của tôi:

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

Và 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

Và ở client.rb cuối cùng (Mô hình và Lớp 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

Nếu nó hữu ích thì tệp spec_helper.rb của tôi:

# 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

Điều làm việc cho tôi là xóa dòng --require spec_helperkhỏi .rspec. Vì nó đã được chứa --require rails_helper, đang được tải sau đó spec_helper.
Yuri Ghensev

Câu trả lời:


91

Tệp của bạn spec_helperthiếu một số lệnh quan trọng. Cụ thể, nó không bao gồm cấu hình / môi trường và khởi tạo rspec-rails.

Bạn có thể thêm các dòng sau vào đầu spec/spec_helper.rbtệp của mình

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

hoặc bạn chỉ có thể chạy

rails generate rspec:install

và ghi đè của bạn spec_helperbằng một cái được tạo để sử dụng với rspec-rails.


30
Các phiên bản RSpec mới hơn di chuyển một số nội dung ra khỏi spec/spec_helper.rbtệp, vì vậy bây giờ bạn cũng nhận được một spec/rails_helper.rbtệp. Nếu bạn chạy rails generate rspec:install, đây là những gì nó tạo ra (rspec-rails 3.0.1, rails 4.1.1). Hóa ra rails_helper.rbtệp chứa một số mã tương tự như mã của bạn và cần được yêu cầu khi bạn muốn tải Rails trong thông số kỹ thuật của mình.
Dennis

Dennis đang đi đúng hướng. Tôi tin rằng cấu hình cho các bài kiểm tra sẽ kiểm tra khả năng của Rails nên được chuyển từ spec_helper.rbsang rails_helper.rb. Ngoài ra, hãy nhớ đọc các bình luận trong rails_helper.rbđó đề cập đến cách rspec-railscó thể infer_spec_type_from_file_location, điều này có thể khiến bạn chuyển các bài kiểm tra thông số kỹ thuật của mình thành các thứ tự con khác nhau spec/*/.
Stephen Henderson

21
nếu bạn muốn bao gồm spec/rails_helper.rbtự động bạn có thể làm điều đó trong bạn .rspecbằng cách thêm--require rails_helper
schmijos

3
Nhưng không thêm --require rails_helperđể .rspecđánh bại điểm của hai người trợ giúp. Tôi nghĩ sau đó bạn sẽ luôn tải rails_helper (và do đó là Rails), ngay cả đối với các thông số kỹ thuật không cần Rails.
Jon Garvin

Điều này đã giúp rất nhiều. Tôi thực sự cần thiết để cập nhật của tôi .travis.ymlđếnbin/rspec
Peter Ehrlich

155

Trong rails 4.x (rspec-rails 3.1.0) sử dụng

require "rails_helper"  # this

không phải

require "spec_helper"   # not this

trong các tệp thông số kỹ thuật của bạn


2
Đây nên là câu hỏi của riêng nó ở đâu đó cho mục đích Google; Tôi đã đấu tranh với những gì tôi nghĩ là Capybara bị hỏng, hoặc bệ phóng bị hỏng, hoặc bị hỏng (điền vào viên ngọc), và tất cả là do sự thay đổi một dòng này.
EthanK

yêu cầu "rails_helper" hoạt động trên đường ray 3.2.22 (rspec-rails 3.2.1)
shilovk

Điều này thật khó hiểu. Tôi đang xây dựng một ứng dụng Rails 6 mới và chạy thông số kỹ thuật đầu tiên của mình. Nó chắc chắn đang tải tệp rails_helper.rb, nhưng bây giờ tôi thấy nó đang cố tải nó sau khi cố gắng chạy thông số kỹ thuật. Đã thêm vào require "rails_helper"đầu thông số kỹ thuật của tôi và tôi đã sẵn sàng.
Travis

19

Bạn cũng có thể muốn thêm --require rails_helpervào .rspectệp của mình để nó trông giống như thế này.

--color
--require spec_helper
--require rails_helper

Bạn sẽ không cần phải yêu cầu rails_helper trong tất cả các thông số kỹ thuật của mình, sau đó.


2
Điều này thật tuyệt nếu bạn cần tải môi trường Rails cho mọi thử nghiệm, nhưng nếu không, điều này cuối cùng sẽ khiến bộ thử nghiệm của bạn chậm hơn mức cần thiết, như một số đã đề cập trong phần nhận xét về một câu trả lời khác ở trên.
jamesmarkcook

8

Tôi đang sử dụng Rails 5.0.0.1.
Đây là cách tôi giải quyết mối quan tâm này.

Trên Gemfile của bạn, vui lòng thêm -> gem 'rspec-rails', "> = 2.0.0.beta"

Như vậy,

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

Lý do: nếu rspec-rails không được thêm vào và khi bạn thực hiện lệnh rspec, nó sẽ tạo ra lỗi này -> "không thể tải tệp đó - rails_helper"

Bây giờ, thực hiện lệnh này trên thiết bị đầu cuối.

gói cài đặt

Khi lệnh gói hoạt động tốt, hãy thực thi lệnh tạo đường ray. Như vậy,

rails tạo rspec: cài đặt

Lý do: lệnh này sẽ tạo một .rspec mới (nhấn ghi đè khi được nhắc), spec / rails_helper.rb và spec / spec_helper.rb

Bây giờ, tại thời điểm này, rspec sẽ chạy đúng cách.
Tuy nhiên, nếu bạn gặp lỗi trong đó không tìm thấy trong mô hình, ví dụ không thể tải tệp như vậy - ý tưởng , hãy thử thêm tệp này lên đầu spec / spec_helper.rb của bạn

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

Lý do: có vẻ như spec_helper không tải môi trường Rails. Chúng tôi đang yêu cầu nó.

Hi vọng điêu nay co ich!


2

Mọi thứ đã thay đổi một chút kể từ khi luồng này được tạo, tôi cũng đã gặp uninitialized constant ClassName (NameError)lỗi khi sử dụng Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Tôi đã giải quyết được vấn đề của mình khi đọc tài liệu về gem rspec-rails:

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

nơi nó xác nhận những gì Swards nói về việc yêu cầu "rails_helper" chứ không phải "spec_helper" nữa.

Ngoài ra, thông số kỹ thuật mô hình của tôi trông giống mô hình từ tài liệu đá quý hơn

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

Thư mục nhà máy xác định trong ứng dụng của bạn

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

  end
end

Tệp RSpec Bộ điều khiển của bạn:

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

1

Nếu các câu trả lời khác trong câu hỏi này không hoạt động, hãy thử:

  • Kiểm tra xem có bất kỳ lỗi đánh máy nào trong tên tệp hoặc tên lớp không (chúng phải khớp)

Nếu không thì,

  • Kiểm tra config/environment/test.rbtệp của bạn , xem có không config.eager_load = false, đặt nó thành true.

Bạn nên kiểm tra theo thứ tự đã viết vì bạn không muốn giải quyết vấn đề với lỗi đánh máy ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.