J'écris des tests sur Rspec pour mes modèles dans l'application Ruby on Rails .
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
Il manque certaines commandes importantes dans votre fichier spec_helper
. Spécifiquement, cela n'inclut pas config/environment et initializing rspec-Rails
.
Vous pouvez ajouter les lignes suivantes au début de votre fichier spec/spec_helper.rb
ENV["Rails_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/Rails'
require 'rspec/autorun'
ou tu peux juste courir
Rails generate rspec:install
et écrasez votre spec_helper
avec celui généré pour une utilisation avec rspec-Rails
.
Dans Rails 4.x (rspec-Rails 3.1.0), utilisez
require "Rails_helper" # this
ne pas
require "spec_helper" # not this
dans vos fichiers spec
Vous voudrez peut-être aussi ajouter --require Rails_helper
dans votre fichier .rspec
afin qu'il ressemble à ceci.
--color
--require spec_helper
--require Rails_helper
Vous n'aurez pas besoin d'exiger Rails_helper dans toutes vos spécifications, après cela.
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 rspec-Rails n'est pas ajouté et que vous exécutez la commande rspec, il générera cette erreur -> "ne peut pas charger ce fichier - Rails_helper"
Maintenant, exécutez cette commande sur le terminal.
installation groupée
Une fois que la commande de bundle a bien fonctionné, exécutez la génération de Rails. Ainsi,
Les rails génèrent rspec: install
Motif: cette commande créera un nouveau fichier .rspec (remplacement par écrasement à l'invite), spec/Rails_helper.rb et spec/spec_helper.rb.
À ce stade, rspec devrait fonctionner correctement.
Cependant, si vous rencontrez une erreur où le modèle n’est pas trouvé, par ex. ne peut pas charger un tel fichier - idée, essayez de l'ajouter à votre spéc/spec_helper.rb
require 'rubygems'
ENV["Rails_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
Raison: semble que spec_helper ne charge pas l'environnement Rails. Nous l'exigeons.
J'espère que cela t'aides!
Les choses ont un peu bougé depuis la création de ce fil. J'ai également rencontré l'erreur uninitialized constant ClassName (NameError)
avec Ruby 2.1, Rails 4.2, rspec-Rails 3.3.
J'ai résolu mes problèmes en lisant la documentation relative au gem rspec-Rails:
https://github.com/rspec/rspec-Rails#model-specs
où cela confirme ce que Swards dit à propos d’exiger que "Rails_helper" ne soit plus "spec_helper".
De plus, mes spécifications de modèle ressemblent davantage à celles des documents de 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
Si les autres réponses à cette question ne fonctionnent pas, essayez:
Autrement,
config/environment/test.rb
, Voyez s'il y 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 de la faute de frappe.
Dossier usines défini dans votre application
FactoryBot.define do
factory :user_params , :class => 'User' do
username 'Alagesan'
password '$1234@..'
end
end
Votre fichier RSpec de contrôleur:
it 'valid params' do
post :register, params: {:user => user_params }
end