Rspec ne voit pas ma classe de modèle. erreur constante non initialisée

86

J'écris des tests sur Rspec pour mes modèles dans l'application Ruby on Rails. Et je reçois cette erreur lors du démarrage de '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 pouvait ê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
Stan
la source
Ce qui a fonctionné pour moi a été la suppression de la ligne --require spec_helperde .rspec. Comme il contenait déjà --require rails_helper, qui était chargé après spec_helper.
Yuri Ghensev

Réponses:

91

Il spec_helpermanque à votre fichier certaines commandes importantes. Plus précisément, cela n'inclut pas la configuration / l'environnement et l'initialisation rspec-rails.

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

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

ou tu peux simplement courir

rails generate rspec:install

et écrasez votre spec_helperpar un généré pour une utilisation avec rspec-rails.

gmacdougall
la source
30
Les versions plus récentes de RSpec déplacent certaines choses hors du spec/spec_helper.rbfichier, donc maintenant vous obtenez également un spec/rails_helper.rbfichier. Si vous exécutez rails generate rspec:install, c'est ce qu'il produit (rspec-rails 3.0.1, rails 4.1.1). Il s'avère que le rails_helper.rbfichier contient un code similaire au vôtre et devrait être requis lorsque vous souhaitez charger Rails dans vos spécifications.
Dennis
Dennis est sur la bonne voie. Je pense que la configuration des tests qui vont tester les capacités de Rails devrait être déplacée de spec_helper.rbvers rails_helper.rb. Assurez-vous également de lire les commentaires dans rails_helper.rbcette mention comment rspec-railspeut infer_spec_type_from_file_location, ce qui pourrait vous amener à déplacer vos tests de spécifications dans différents sous- spec/*/répertoires.
Stephen Henderson
21
si vous souhaitez inclure spec/rails_helper.rbautomatiquement, vous pouvez le faire dans votre .rspecen ajoutant--require rails_helper
schmijos
3
Mais cela n'ajoute pas --require rails_helperà .rspecvaincre le point de séparer les deux aides. Je pense que vous allez toujours charger des rails_helper (et donc des Rails), même pour les spécifications qui n'ont pas besoin de Rails.
Jon Garvin
Cela a beaucoup aidé. J'avais en fait besoin de mettre à jour mon .travis.ymltobin/rspec
Peter Ehrlich
155

Dans les rails 4.x (rspec-rails 3.1.0), utilisez

require "rails_helper"  # this

ne pas

require "spec_helper"   # not this

dans vos fichiers de spécifications

Mark Swardstrom
la source
2
Cela devrait être sa propre question quelque part à des fins de recherche sur Google; J'ai eu du mal avec ce que je pensais être un Capybara cassé, ou un lancer cassé, ou cassé (remplissez la gemme), et tout cela était dû à ce changement de ligne.
EthanK
exigent le travail de "rails_helper" sur les rails 3.2.22 (rspec-rails 3.2.1)
shilovk
C'était super déroutant. Je construis une nouvelle application Rails 6 et j'exécute ma première spécification. Il chargeait définitivement le fichier rails_helper.rb, mais je vois maintenant qu'il essayait de le charger après avoir tenté d'exécuter la spécification. Ajouté require "rails_helper"au sommet de mes spécifications et j'étais prêt à partir.
Travis le
19

Vous pouvez également ajouter --require rails_helperdans votre .rspecfichier 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.

Umang Raghuvanshi
la source
2
C'est génial si vous devez charger l'environnement Rails pour chaque test, mais si ce n'est pas le cas, votre suite de tests sera éventuellement plus lente que nécessaire, comme certains l'ont mentionné dans les commentaires sur une autre réponse ci-dessus.
jamesmarkcook
8

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

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

Ainsi,

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

Raison: si le rspec-rails n'est pas ajouté et lorsque vous exécutez la commande rspec, cela générera cette erreur -> "impossible de charger un tel fichier - rails_helper"

Maintenant, exécutez cette commande sur le terminal.

installation groupée

Une fois que la commande bundle s'est bien déroulée, exécutez la génération des rails. Ainsi,

les rails génèrent rspec: installer

Raison: cette commande créera un nouveau .rspec (écrasement à l'invite), 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 impossible de charger un tel fichier - idée , essayez de l'ajouter 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 en avons besoin.

J'espère que cela t'aides!

Kent Aguilar
la source
2

Les choses ont un peu bougé depuis la création de ce fil, j'ai également rencontré l' uninitialized constant ClassName (NameError)erreur en utilisant Ruby 2.1, Rails 4.2, rspec-rails 3.3.

J'ai résolu mes problèmes en lisant la documentation du gem rspec-rails:

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

où il confirme ce que Swards dit à propos du besoin de "rails_helper" et non plus de "spec_helper".

De plus, la spécification de mon modèle ressemble plus à celle de la documentation sur les gemmes

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
Arnaud Bouchot
la source
1

Dossier Usines défini dans votre application

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

  end
end

Votre fichier Controller RSpec:

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

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

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

Autrement,

  • Vérifiez votre config/environment/test.rbfichier, voyez s'il y en a config.eager_load = false, réglez-le sur true.

Vous devriez vérifier l'ordre écrit car vous ne voulez pas résoudre le problème avec la faute de frappe qui s'y trouve.

Longfei Wu
la source