Estoy escribiendo pruebas en Rspec para mis modelos en la aplicación Ruby on Rails. Y recibo este error al iniciar 'rspec spec'
command:
/spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError)
Yo uso Rails 4.0.0 y Ruby 2.0.0
Aquí está mi 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
Y 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
Y por último client.rb (Modelo y Clase 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 fuera útil mi archivo 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
ruby-on-rails
testing
model
rspec
Stan
fuente
fuente
--require spec_helper
de.rspec
. Como ya contenía--require rails_helper
, que se estaba cargando despuésspec_helper
.Respuestas:
A su
spec_helper
archivo le faltan algunos comandos importantes. Específicamente, no incluye config / environment ni la inicializaciónrspec-rails
.Puede agregar las siguientes líneas al inicio de su
spec/spec_helper.rb
archivoENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun'
o simplemente puedes correr
rails generate rspec:install
y sobrescriba su
spec_helper
con uno generado para su uso conrspec-rails
.fuente
spec/spec_helper.rb
archivo, por lo que ahora también obtiene unspec/rails_helper.rb
archivo. Si ejecutarails generate rspec:install
, esto es lo que produce (rspec-rails 3.0.1, rails 4.1.1). Resulta que elrails_helper.rb
archivo contiene un código similar al tuyo y debería ser necesario cuando quieras cargar Rails en tus especificaciones.spec_helper.rb
arails_helper.rb
. Además, asegúrese de leer los comentarios enrails_helper.rb
esa mención cómo serspec-rails
puedeinfer_spec_type_from_file_location
, lo que podría hacer que reubique sus pruebas de especificaciones en diferentesspec/*/
subdivisiones.spec/rails_helper.rb
automáticamente, puede hacerlo en su.rspec
agregando--require rails_helper
--require rails_helper
para.rspec
derrotar el punto de separar a los dos ayudantes. Creo que entonces siempre estarás cargando rails_helper (y por lo tanto Rails), incluso para especificaciones que no necesitan Rails..travis.yml
abin/rspec
En rails 4.x (rspec-rails 3.1.0) use
require "rails_helper" # this
no
require "spec_helper" # not this
en sus archivos de especificaciones
fuente
require "rails_helper"
a la parte superior de mi especificación y estaba listo para comenzar.Es posible que también desee agregar
--require rails_helper
su.rspec
archivo para que se vea así.--color --require spec_helper --require rails_helper
No necesitará requerir rails_helper en todas sus especificaciones, después de esto.
fuente
Estoy usando Rails 5.0.0.1.
Así es como resolví esta inquietud.
En su Gemfile, agregue -> gem 'rspec-rails', "> = 2.0.0.beta"
Al igual que,
group :development, :test do gem 'rspec-rails', ">= 2.0.0.beta" end
Razón: si no se agrega rspec-rails y cuando ejecuta el comando rspec, generará este error -> "no se puede cargar dicho archivo - rails_helper"
Ahora, ejecute este comando en la terminal.
Una vez que el comando bundle salió bien, ejecute los rails generate. Al igual que,
Razón: este comando creará un nuevo .rspec (presione sobrescribir cuando se le solicite), spec / rails_helper.rb y spec / spec_helper.rb
Ahora, en este punto, rspec debería ejecutarse correctamente.
Sin embargo, si encuentra un error en el que no se encuentra el modelo, por ejemplo , no se puede cargar dicho archivo, idea , intente agregar esto en la parte superior de su spec / spec_helper.rb
require 'rubygems' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__)
Motivo: parece que spec_helper no está cargando el entorno de Rails. Lo estamos requiriendo.
¡Espero que esto ayude!
fuente
Las cosas se han movido un poco desde que se creó este hilo, también he experimentado el
uninitialized constant ClassName (NameError)
error al usar Ruby 2.1, Rails 4.2, rspec-rails 3.3.He resuelto mis problemas leyendo la documentación de la gema rspec-rails:
https://github.com/rspec/rspec-rails#model-specs
donde confirma lo que dice Swards acerca de requerir "rails_helper" y no "spec_helper".
Además, la especificación de mi modelo se parece más a la de los documentos de gemas
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
fuente
Carpeta de fábricas definida en su aplicación
FactoryBot.define do factory :user_params , :class => 'User' do username 'Alagesan' password '$1234@..' end end
Su archivo Controller RSpec:
it 'valid params' do post :register, params: {:user => user_params } end
fuente
Si otras respuestas de esta pregunta no funcionan, intente:
De lo contrario,
config/environment/test.rb
archivo, vea si lo hayconfig.eager_load = false
, configúrelo entrue
.Debe verificar el orden por escrito, ya que no desea resolver el problema con el error tipográfico allí.
fuente