Rspec ไม่เห็นรุ่น Class ของฉัน ข้อผิดพลาดคงที่ที่ไม่ได้เริ่มต้น


88

ฉันกำลังเขียนการทดสอบเกี่ยวกับ 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 Model and Class):

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 / 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-ราง 3.0.1 ราง 4.1.1) ปรากฎว่าrails_helper.rbไฟล์มีโค้ดที่คล้ายกับของคุณและควรจะต้องใช้เมื่อคุณต้องการโหลด Rails ตามข้อกำหนดของคุณ
Dennis

เดนนิสมาถูกทางแล้ว ผมเชื่อว่าการกำหนดค่าที่สำหรับการทดสอบที่กำลังจะได้รับการทดสอบความสามารถทางรถไฟควรจะย้ายจากเข้าspec_helper.rb rails_helper.rbนอกจากนี้ยังให้แน่ใจว่าได้อ่านความคิดเห็นในrails_helper.rbการกล่าวถึงว่าวิธีการที่rspec-railsสามารถinfer_spec_type_from_file_locationซึ่งอาจทำให้คุณย้ายทดสอบสเป็คของคุณให้เป็นที่แตกต่างกันspec/*/subdirs
Stephen Henderson

21
หากคุณต้องการรวมspec/rails_helper.rbโดยอัตโนมัติคุณสามารถทำได้.rspecโดยเพิ่ม--require rails_helper
schmijos

3
แต่ไม่ได้เพิ่ม--require rails_helperเพื่อ.rspecเอาชนะจุดที่จะแยกผู้ช่วยทั้งสอง ฉันคิดว่าคุณจะโหลด rail_helper เสมอ (ดังนั้น Rails) แม้จะเป็นสเปคที่ไม่ต้องใช้ Rails ก็ตาม
Jon Garvin

สิ่งนี้ช่วยได้มาก ฉันต้องการอัปเดต.travis.ymlเป็นbin/rspec
Peter Ehrlich

156

ในราง 4.x (rspec-rail 3.1.0) ให้ใช้

require "rails_helper"  # this

ไม่

require "spec_helper"   # not this

ในไฟล์ข้อมูลจำเพาะของคุณ


2
นี่ควรเป็นคำถามของตัวเองสำหรับจุดประสงค์ของ Googling ฉันพยายามดิ้นรนกับสิ่งที่ฉันคิดว่าพังคาปิบาร่าหรือพังทลายหรือแตก (เติมอัญมณี) และทั้งหมดนี้เกิดจากการเปลี่ยนแปลงบรรทัดเดียว
EthanK

ต้องใช้ "rail_helper" บนราง 3.2.22 (rspec-rail 3.2.1)
shilovk

นี่สับสนสุด ๆ ฉันกำลังสร้างแอพ Rails 6 ใหม่และใช้งานสเป็คแรกของฉัน มันกำลังโหลดไฟล์ rail_helper.rb อย่างแน่นอน แต่ตอนนี้ฉันเห็นว่ามันพยายามโหลดหลังจากพยายามเรียกใช้ข้อมูลจำเพาะ เพิ่มrequire "rails_helper"ไปที่ด้านบนของข้อมูลจำเพาะของฉันและฉันก็พร้อมที่จะไป
Travis

19

คุณอาจต้องการเพิ่ม--require rails_helperใน.rspecไฟล์ของคุณเพื่อให้มีลักษณะเช่นนี้

--color
--require spec_helper
--require rails_helper

คุณไม่จำเป็นต้องใช้ rail_helper ในข้อกำหนดทั้งหมดของคุณหลังจากนี้


2
นี่เป็นสิ่งที่ดีหากคุณต้องการโหลดสภาพแวดล้อม Rails สำหรับการทดสอบทุกครั้ง แต่หากไม่เป็นเช่นนี้จะทำให้ชุดทดสอบของคุณช้ากว่าที่ควรจะเป็นตามที่มีบางคนกล่าวไว้ในความคิดเห็นของคำตอบอื่นข้างต้น
jamesmarkcook

8

ฉันใช้Rails 5.0.0.1
นี่คือวิธีที่ฉันแก้ไขข้อกังวลนี้

ใน Gemfile ของคุณโปรดเพิ่ม -> gem 'rspec-railway', "> = 2.0.0.beta"

เช่นนั้น

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

เหตุผล:หากไม่ได้เพิ่ม rspec-rail และเมื่อคุณรันคำสั่ง rspec มันจะสร้างข้อผิดพลาดนี้ -> "ไม่สามารถโหลดไฟล์ดังกล่าวได้ - rail_helper"

ตอนนี้รันคำสั่งนี้บนเทอร์มินัล

การติดตั้งมัด

เมื่อคำสั่งบันเดิลทำงานได้ดีให้รันการสร้างราง เช่นนั้น

รางสร้าง rspec: ติดตั้ง

เหตุผล:คำสั่งนี้จะสร้าง. rspec ใหม่ (กดทับเมื่อได้รับแจ้ง), spec / rail_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-rail 3.3

ฉันได้แก้ปัญหาในการอ่านเอกสาร rspec-rail gem:

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

ซึ่งเป็นการยืนยันสิ่งที่ Swards กล่าวเกี่ยวกับการกำหนดให้ "rail_helper" ไม่ใช่ "spec_helper" อีกต่อไป

นอกจากนี้ข้อกำหนดรุ่นของฉันยังดูเหมือนจากเอกสารอัญมณีมากกว่า

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

ไฟล์ Controller RSpec ของคุณ:

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

1

หากคำตอบอื่น ๆ ในคำถามนี้ไม่ได้ผลให้ลอง:

  • ตรวจสอบว่ามีการพิมพ์ผิดในชื่อไฟล์หรือชื่อคลาสหรือไม่ (ควรตรงกัน)

มิฉะนั้น,

  • ตรวจดูconfig/environment/test.rbไฟล์ดูว่ามีการตั้งเป็นconfig.eager_load = falsetrue

คุณควรตรวจสอบตามลำดับลายลักษณ์อักษรเนื่องจากคุณไม่ต้องการแก้ปัญหาด้วยการพิมพ์ผิดที่นั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.