Rspec non vede il mio modello Class. errore costante non inizializzato


86

Sto scrivendo test su Rspec per i miei modelli nell'applicazione Ruby on Rails. E ricevo questo errore durante l'avvio di "spec rspec"

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

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 infine client.rb (modello e classe 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

Se fosse utile il 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

Ciò che ha funzionato per me è stato rimuovere la linea --require spec_helperda .rspec. Poiché già conteneva --require rails_helper, che veniva caricato dopo spec_helper.
Yuri Ghensev

Risposte:


91

Nel tuo spec_helperfile mancano alcuni comandi importanti. In particolare, non include configurazione / ambiente e inizializzazione rspec-rails.

È possibile aggiungere le seguenti righe all'inizio del spec/spec_helper.rbfile

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

oppure puoi semplicemente correre

rails generate rspec:install

e sovrascrivi il tuo spec_helpercon quello generato per l'uso con rspec-rails.


30
Le versioni più recenti di RSpec spostano alcune cose fuori dal spec/spec_helper.rbfile, quindi ora ottieni anche un spec/rails_helper.rbfile. Se esegui rails generate rspec:install, questo è ciò che produce (rspec-rails 3.0.1, rails 4.1.1). Si scopre che il rails_helper.rbfile contiene del codice simile al tuo e dovrebbe essere richiesto quando vuoi caricare Rails nelle tue specifiche.
Dennis

Dennis è sulla strada giusta. Credo che la configurazione per i test che testeranno le capacità di Rails dovrebbe essere spostata da spec_helper.rbin rails_helper.rb. Inoltre, assicurati di leggere i commenti in rails_helper.rbquella menzione come rspec-railspuò infer_spec_type_from_file_location, il che potrebbe farti riposizionare i tuoi test delle specifiche in diverse spec/*/sottodirectory.
Stephen Henderson

21
se vuoi includerlo spec/rails_helper.rbautomaticamente puoi farlo nel tuo .rspecaggiungendo--require rails_helper
schmijos

3
Ma non aggiunge --require rails_helperper .rspecsconfiggere il punto di separare i due aiutanti. Penso che caricherai sempre rails_helper (e quindi Rails), anche per le specifiche che non necessitano di Rails.
Jon Garvin

Questo ha aiutato molto. In realtà avevo bisogno di aggiornare il mio .travis.ymlabin/rspec
Peter Ehrlich

155

In rails 4.x (rspec-rails 3.1.0) utilizzare

require "rails_helper"  # this

non

require "spec_helper"   # not this

nei file delle specifiche


2
Questa dovrebbe essere la sua stessa domanda da qualche parte per scopi di Google; Ho lottato con quello che pensavo fosse Capybara rotto, o launchy rotto, o rotto (riempire la gemma), ed è stato tutto dovuto a questo cambio di riga.
EthanK

richiedono "rails_helper" lavoro su rails 3.2.22 (rspec-rails 3.2.1)
shilovk

Questo è stato molto confuso. Sto costruendo una nuova app Rails 6 e sto eseguendo la mia prima specifica. Stava sicuramente caricando il file rails_helper.rb, ma ora vedo che stava cercando di caricarlo dopo aver tentato di eseguire la specifica. Aggiunto require "rails_helper"alla parte superiore della mia specifica ed ero a posto.
Travis,

19

Potresti anche aggiungere --require rails_helpernel tuo .rspecfile in modo che assomigli a questo.

--color
--require spec_helper
--require rails_helper

Non avrai bisogno di richiedere rails_helper in tutte le tue specifiche, dopo questo.


2
Questo è ottimo se hai bisogno di caricare l'ambiente Rails per ogni test, ma in caso contrario alla fine la tua suite di test sarà più lenta di quanto dovrebbe essere, come alcuni hanno menzionato nei commenti su un'altra risposta sopra.
jamesmarkcook

8

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

Sul tuo Gemfile, aggiungi -> gem 'rspec-rails', "> = 2.0.0.beta"

Così,

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

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

Ora, esegui questo comando sul terminale.

installazione bundle

Una volta che il comando bundle è andato a buon fine, esegui rails generate. Così,

rails genera rspec: install

Motivo: questo comando creerà un nuovo .rspec (premi sovrascrivi 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 è stato trovato, ad esempio non è possibile caricare tale file - idea , prova ad aggiungerlo sopra il tuo spec / spec_helper.rb

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

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

Spero che sia di aiuto!


2

Le cose sono cambiate un po 'da quando è stato creato questo thread, anch'io ho riscontrato l' uninitialized constant ClassName (NameError)errore usando Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Ho risolto i miei problemi leggendo la documentazione gem di rspec-rails:

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

dove conferma ciò che Swards dice sulla richiesta di "rails_helper" e non "spec_helper".

Anche la mia specifica del modello assomiglia di più a quella dei documenti gem

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

La cartella delle fabbriche viene definita nella tua app

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

  end
end

Il file RSpec del controller:

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

1

Se altre risposte a questa domanda non funzionano, prova:

  • Controlla se c'è qualche errore di battitura nel nome del file o nel nome della classe (dovrebbero corrispondere)

Altro saggio,

  • Controlla il tuo config/environment/test.rbfile, vedi se c'è config.eager_load = false, impostalo su true.

Dovresti controllare nell'ordine scritto poiché non vuoi risolvere il problema con l'errore di battitura che giace lì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.