110 votes

Rspec ne voit pas mon modèle Class. Erreur de constante non initialisée

J'écris des tests sur Rspec pour mes modèles dans une application Ruby on Rails. Et je reçois cette erreur en lançant 'rspec spec'.

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

J'utilise Rails 4.0.0 et Ruby 2.0.0.

Voici mon 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

Et 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

Et enfin client.rb (Modèle et 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

Si cela peut être utile, mon fichier 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

177voto

Swards Points 3017

Dans rails 4.x et ultérieur (rspec-rails 3.1.0 et ultérieur) ajoutez ceci au début de chacun de vos fichiers de spécification :

require "rails_helper"  # this

no

require "spec_helper"   # not this

95voto

gmacdougall Points 4811

Votre spec_helper manque certaines commandes importantes. Plus précisément, il n'inclut pas config/environnement et n'initialise pas rspec-rails .

Vous pouvez ajouter les lignes suivantes au début de votre fichier spec/spec_helper.rb fichier

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

ou vous pouvez simplement exécuter

rails generate rspec:install

et écraser votre spec_helper et un autre généré pour être utilisé avec rspec-rails .

23voto

Umang Raghuvanshi Points 692

Vous pouvez également ajouter --require rails_helper dans votre .rspec pour qu'il ressemble à ceci.

--color
--require spec_helper
--require rails_helper

Vous n'aurez plus besoin d'exiger rails_helper dans toutes vos spécifications, après cela.

8voto

kentaguilar Points 31

J'utilise Rails 5.0.0.1.
Voici comment j'ai résolu ce problème.

Dans votre Gemfile, veuillez ajouter -> gem 'rspec-rails', ">= 2.0.0.beta"

Comme ça,

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

Raison : si la rspec-rails n'est pas ajoutée et que vous exécutez la commande rspec, elle générera cette erreur -> "Impossible de charger un tel fichier -- rails_helper"

Maintenant, exécutez cette commande sur le terminal.

installation du faisceau

Une fois que la commande du bundle s'est déroulée correctement, exécutez la génération de rails. Comme ceci,

rails generate rspec:install

Raison : cette commande créera un nouveau .rspec (cliquez sur écraser lorsque vous y êtes invité), spec/rails_helper.rb et spec/spec_helper.rb.

Maintenant, à ce stade, rspec devrait fonctionner correctement.
Cependant, si vous rencontrez une erreur où le modèle n'est pas trouvé, par exemple. ne peut pas charger un tel fichier -- idée essayez d'ajouter ceci en haut de votre spec/spec_helper.rb

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

Raison : Il semble que spec_helper ne charge pas l'environnement Rails. Nous le demandons.

J'espère que cela vous aidera !

8voto

Longfei Wu Points 131

Si les autres réponses à cette question ne fonctionnent pas, essayez :

  • Vérifiez s'il n'y a pas de faute de frappe dans le nom du fichier ou de la classe (ils doivent correspondre).

Autres sages,

  • Vérifiez votre config/environment/test.rb fichier, voir s'il y a config.eager_load = false et le régler sur true .

Vous devriez vérifier dans l'ordre écrit car vous ne voulez pas résoudre le problème avec la coquille qui se trouve là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X