2013-07-06 12 views
60

Sto scrivendo test su Rspec per i miei modelli nell'applicazione Ruby on Rails. e ricevo questo errore durante l'avvio di 'spec rspec'Rspec non vede il mio modello di classe. errore costante non inizializzato

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

Io uso Rails 4.0.0 e Ruby 2.0.0

Ecco il mio 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 

E 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 

e alla fine client.rb (modello ROR e Classe):

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 

Se Sarebbe utile mio file 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 
+0

Ciò che ha funzionato per me è stato rimuovere la riga '--require spec_helper' da' .rspec'. Come già conteneva '--require rails_helper', che veniva caricato dopo' spec_helper'. –

risposta

68

Il file spec_helper mancano alcuni comandi importanti. In particolare, non include la configurazione/ambiente e l'inizializzazione rspec-rails.

È possibile aggiungere le seguenti righe per l'inizio della vostra spec/spec_helper.rb file di

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

o si può semplicemente eseguire

rails generate rspec:install 

e sovrascrivere il spec_helper con quello generato per l'uso con rspec-rails.

+26

Le versioni più recenti di RSpec spostano alcune cose dal file 'spec/spec_helper.rb', quindi ora si ottiene anche un file' spec/rails_helper.rb'. Se esegui 'rails genera rspec: install', [questo è ciò che produce] (http://pastie.org/9280896) (rspec-rails 3.0.1, rails 4.1.1). Risulta che il file 'rails_helper.rb' contiene del codice simile al tuo e dovrebbe essere richiesto quando vuoi caricare Rails nelle tue specifiche. – Dennis

+0

Dennis è sulla buona strada. Credo che la configurazione per i test che testeranno le funzionalità di Rails dovrebbe essere spostata da 'spec_helper.rb' a' rails_helper.rb'. Inoltre, assicurati di leggere i commenti in 'rails_helper.rb' che menzionano come' rspec-rails' può 'infer_spec_type_from_file_location', che potrebbe farti trasferire i tuoi test delle specifiche in diversi sottodirectory' spec/*/'. –

+17

se vuoi includere 'spec/rails_helper.rb' automaticamente puoi farlo nel tuo' .rspec' aggiungendo '--require rails_helper' – schmijos

127

In rotaie 4.x (RSpec-rails 3.1.0) utilizzare

require "rails_helper" # this 
non

require "spec_helper" # not this 

nei file spec

+1

Questa dovrebbe essere la sua domanda da qualche parte per scopi di Google; Ho lottato con quello che pensavo fosse un Capibara rotto, o un razzo rotto, o rotto (riempire la gemma), ed era tutto dovuto a questo cambio di linea. – Ethan

+0

richiede "rails_helper" lavoro su rotaie 3.2.22 (rspec-rails 3.2.1) – shilovk

1

Le cose si sono spostati un po 'dal momento che questa discussione ha stato creato, ho anche avuto l'errore uninitialized constant ClassName (NameError) usando Ruby 2.1, Rails 4.2, rspec-rails 3.3.

ho risolto i miei problemi di lettura della documentazione gemma RSpec-rails:

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

dove si conferma ciò che dice swards circa richiedono "rails_helper" non "spec_helper" più.

Anche il mio specificazione del modello sembra più simile a quello dalla documentazione gemma

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 
8

Ti potrebbe piacere anche aggiungere --require rails_helper nel file .rspec in modo che assomiglia a questo.

--color 
--require spec_helper 
--require rails_helper 

Non sarà necessario richiedere rails_helper in tutte le vostre specifiche, dopo questo.

+1

Questo è ottimo se è necessario caricare l'ambiente Rails per ogni test, ma in caso contrario questo causerà alla tua suite di test di essere più lento di deve essere, come alcuni hanno menzionato nei commenti su un'altra risposta sopra. – jamesmarkcook

5

Sto usando Rails 5.0.0.1.
Ecco come ho risolto questa preoccupazione.

Sul Gemfile, si prega di aggiungere ->gioiello 'RSpec-guide', "> = 2.0.0.beta"

Come così,

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

Motivo: se il rspec-rails non viene aggiunto e quando si esegue il comando rspec, verrà generato questo errore ->"impossibile caricare tale file - rails_helper"

Ora, esegui s comando sul terminale.

bundle install

volta comando bundle è andato bene, eseguire i binari generano. Come così,

rotaie generano rspec: installare

Motivo: questo comando creerà un nuovo .rspec (hit sovrascrivere quando richiesto), spec/rails_helper.rb e spec/spec_helper.rb

Ora, a questo punto, rspec dovrebbe funzionare correttamente.
Tuttavia, se si verifica un errore in cui nel modello non viene trovato ad es. non può caricare tale file - idea, prova ad aggiungere questo in cima alla vostra spec/spec_helper.rb

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

Motivo: sembra che spec_helper non sta caricando l'ambiente Rails. Lo stiamo richiedendo.

Spero che questo aiuti!

Problemi correlati