Rspec no ve mi clase modelo. error constante no inicializado

86

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
Stan
fuente
Lo que funcionó para mí fue la eliminación de la línea --require spec_helperde .rspec. Como ya contenía --require rails_helper, que se estaba cargando después spec_helper.
Yuri Ghensev

Respuestas:

91

A su spec_helperarchivo le faltan algunos comandos importantes. Específicamente, no incluye config / environment ni la inicialización rspec-rails.

Puede agregar las siguientes líneas al inicio de su spec/spec_helper.rbarchivo

ENV["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_helpercon uno generado para su uso con rspec-rails.

gmacdougall
fuente
30
Las versiones más nuevas de RSpec mueven algunas cosas fuera del spec/spec_helper.rbarchivo, por lo que ahora también obtiene un spec/rails_helper.rbarchivo. Si ejecuta rails generate rspec:install, esto es lo que produce (rspec-rails 3.0.1, rails 4.1.1). Resulta que el rails_helper.rbarchivo contiene un código similar al tuyo y debería ser necesario cuando quieras cargar Rails en tus especificaciones.
Dennis
Dennis está en el camino correcto. Creo que la configuración para las pruebas que van a probar las capacidades de Rails debería cambiarse de spec_helper.rba rails_helper.rb. Además, asegúrese de leer los comentarios en rails_helper.rbesa mención cómo se rspec-railspuede infer_spec_type_from_file_location, lo que podría hacer que reubique sus pruebas de especificaciones en diferentes spec/*/subdivisiones.
Stephen Henderson
21
si desea incluirlo spec/rails_helper.rbautomáticamente, puede hacerlo en su .rspecagregando--require rails_helper
schmijos
3
Pero no se suma --require rails_helperpara .rspecderrotar 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.
Jon Garvin
Esto ayudó mucho. De hecho, necesitaba actualizar mi .travis.ymlabin/rspec
Peter Ehrlich
155

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

Mark Swardstrom
fuente
2
Esta debería ser su propia pregunta en algún lugar para fines de búsqueda en Google; He estado luchando con lo que pensé que era un carpincho roto, un launchy roto o roto (completa la gema), y todo se debió a este cambio de una línea.
EthanK
requieren trabajo "rails_helper" en rieles 3.2.22 (rspec-rails 3.2.1)
shilovk
Esto fue muy confuso. Estoy creando una nueva aplicación Rails 6 y ejecutando mi primera especificación. Definitivamente estaba cargando el archivo rails_helper.rb, pero ahora veo que estaba intentando cargarlo después de intentar ejecutar la especificación. Se agregó require "rails_helper"a la parte superior de mi especificación y estaba listo para comenzar.
Travis
19

Es posible que también desee agregar --require rails_helpersu .rspecarchivo 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.

Umang Raghuvanshi
fuente
2
Esto es genial si necesita cargar el entorno Rails para cada prueba, pero si no, esto eventualmente hará que su conjunto de pruebas sea más lento de lo necesario, como algunos han mencionado en los comentarios sobre otra respuesta anterior.
jamesmarkcook
8

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.

instalación del paquete

Una vez que el comando bundle salió bien, ejecute los rails generate. Al igual que,

rieles generan rspec: instalar

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!

Kent Aguilar
fuente
2

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
Arnaud Bouchot
fuente
1

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
Boobalan
fuente
1

Si otras respuestas de esta pregunta no funcionan, intente:

  • Compruebe si hay algún error tipográfico en el nombre del archivo o en el nombre de la clase (deben coincidir)

De lo contrario,

  • Verifique su config/environment/test.rbarchivo, vea si lo hay config.eager_load = false, configúrelo en true.

Debe verificar el orden por escrito, ya que no desea resolver el problema con el error tipográfico allí.

Longfei Wu
fuente