Rspec मेरा मॉडल क्लास नहीं देखता है। अनधिकृत निरंतर त्रुटि


86

मैं रूबी में रूल्स एप्लिकेशन पर अपने मॉडलों के लिए Rspec पर परीक्षण लिख रहा हूं। और 'rspec कल्पना' शुरू करते समय मुझे यह त्रुटि मिली

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

मैं रेल्स 4.0.0 और रूबी 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

और जेमफाइल:

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

और अंतिम ग्राहक पर। आरबी (आरओआर मॉडल और क्लास):

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
यूरी घेंसेव

जवाबों:


91

आपकी spec_helperफ़ाइल कुछ महत्वपूर्ण आदेशों को याद कर रही है। विशेष रूप से, यह कॉन्फ़िगर / पर्यावरण और आरंभीकरण सहित नहीं है 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, रेल 4.1.1)। rails_helper.rbफ़ाइल को चालू करने से आपके पास कुछ समान कोड होते हैं और जब आप अपने चश्मे में रेल लोड करना चाहते हैं तो इसकी आवश्यकता होनी चाहिए।
डेनिस

डेनिस सही रास्ते पर है। मेरा मानना है कि परीक्षण है कि रेल क्षमताओं का परीक्षण करने जा रहे हैं के लिए है कि विन्यास से ले जाया जाना चाहिए spec_helper.rbमें rails_helper.rb। इसके अलावा, rails_helper.rbउस उल्लेख में टिप्पणियों को पढ़ना सुनिश्चित करें कि कैसे rspec-railsहो सकता है infer_spec_type_from_file_location, जो आपको अलग-अलग spec/*/उपखंडों में अपनी कल्पना परीक्षणों को स्थानांतरित कर सकता है ।
स्टीफन हेंडरसन

21
यदि आप spec/rails_helper.rbस्वचालित रूप से शामिल करना चाहते हैं तो आप .rspecइसे जोड़कर कर सकते हैं--require rails_helper
schmijos

3
लेकिन दोनों सहायकों को अलग करने की बात --require rails_helperको .rspecहराने के लिए नहीं जोड़ते । मुझे लगता है कि आप हमेशा पटरियों (और इसलिए रेल) ​​को लोड कर रहे होंगे, यहां तक ​​कि उन स्पेक्स के लिए भी जिन्हें रेल की जरूरत नहीं है।
जॉन गार्विन

इससे काफी मदद मिली। मैं वास्तव में मेरी अद्यतन करने के लिए की जरूरत .travis.ymlके लिएbin/rspec
पीटर एहर्लिच

155

रेल में 4.x (rspec-rails 3.1.0) का उपयोग करते हैं

require "rails_helper"  # this

नहीं

require "spec_helper"   # not this

आपकी कल्पना फाइलों में


2
यह Googling उद्देश्यों के लिए कहीं न कहीं स्वयं का प्रश्न होना चाहिए; मुझे लगा कि मैं क्या सोच रहा था कि कैप्यबारा टूट गया था, या टूटी हुई लैंकी, या टूटी हुई (मणि में भरना), और यह सब इस एक लाइन परिवर्तन के कारण था।
एथन

3.2.22 (rspec- रेल 3.2.1) रेल पर "rails_helper" काम की आवश्यकता है
shilovk

यह सुपर कन्फ्यूजिंग था। मैं एक नई रेल 6 ऐप बना रहा हूं और अपना पहला चश्मा चला रहा हूं। यह निश्चित रूप से rails_helper.rb फ़ाइल को लोड कर रहा था, लेकिन अब मुझे लगता है कि यह युक्ति चलाने के प्रयास के बाद इसे लोड करने की कोशिश कर रहा था। require "rails_helper"मेरी कल्पना के शीर्ष पर जोड़ा गया और मैं जाने के लिए अच्छा था।
ट्रैविस

19

आप --require rails_helperअपनी .rspecफ़ाइल में जोड़ना भी पसंद कर सकते हैं ताकि यह ऐसा दिखे।

--color
--require spec_helper
--require rails_helper

आपको इसके बाद अपने सभी स्पेक्स में rails_helper की आवश्यकता नहीं होगी।


2
यह बहुत अच्छा है अगर आपको प्रत्येक परीक्षण के लिए रेल के वातावरण को लोड करने की आवश्यकता है, लेकिन यदि यह अंततः आपके परीक्षण सूट को धीमा करने की आवश्यकता नहीं होगी, जैसा कि ऊपर दिए गए एक अन्य उत्तर में टिप्पणियों में उल्लेख किया गया है।
jamesmarkcook

8

मैं 5.0.0.1 रेल का उपयोग कर रहा हूं
यहां बताया गया है कि मैंने इस चिंता को कैसे हल किया।

अपने Gemfile पर, कृपया जोड़ें -> मणि 'rspec- रेल', "> = 2.0.0.beta"

इस तरह,

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

कारण: यदि rspec-rails नहीं जोड़ा गया है और जब आप rspec कमांड निष्पादित करते हैं, तो यह इस त्रुटि को उत्पन्न करेगा -> "ऐसी फाइल लोड नहीं कर सकता है - rails_helper"

अब, टर्मिनल पर इस कमांड को निष्पादित करें।

बंडल स्थापित करें

एक बार बंडल कमांड अच्छा हो गया, रेल उत्पन्न निष्पादित करें। इस तरह,

रेल उत्पन्न rspec: स्थापित करें

कारण: यह कमांड एक नया .rspec (हिट ओवरराइट होने पर, जब संकेत दिया जाएगा), युक्ति / रेल_हेलर.ब्र और युक्ति / spec_helper.rb बनाएगा

अब, इस बिंदु पर, rspec को बहुत अधिक ठीक से चलना चाहिए।
हालाँकि, यदि आपको कोई त्रुटि आती है जहाँ मॉडल नहीं मिला है, उदाहरण के लिए इस तरह की फ़ाइल लोड नहीं कर सकते - विचार , अपने कल्पना / spec_helper.rb के शीर्ष पर इसे जोड़ने का प्रयास करें

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

कारण: ऐसा लगता है कि spec_helper रेल वातावरण लोड नहीं कर रहा है। हमें इसकी आवश्यकता है।

उम्मीद है की यह मदद करेगा!


2

इस धागे के बनने के बाद से चीजें थोड़ी बढ़ गई हैं, मैंने uninitialized constant ClassName (NameError)रूबी 2.1, रेल्स 4.2, आरपीईसी-रेल 3.3 का उपयोग करके त्रुटि का अनुभव किया है ।

मैं अपनी समस्याओं को हल कर दिया है rspec- रेल रत्न प्रलेखन पढ़ने:

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

जहां यह पुष्टि करता है कि "Rails_helper" को "spec_helper" नहीं होने की आवश्यकता के बारे में Swards क्या कहता है।

साथ ही मेरा मॉडल विनिर्देश रत्न डॉक्स से अधिक दिखता है

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

आपको लिखित आदेश में जाँच करनी चाहिए क्योंकि आप वहाँ पर टाइपो बिछाने के साथ समस्या को हल नहीं करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.