Rspec não vê meu modelo de classe. erro constante não inicializado

86

Estou escrevendo testes em Rspec para meus modelos no aplicativo Ruby on Rails. E recebo este erro ao iniciar 'rspec spec'

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

Eu uso Rails 4.0.0 e Ruby 2.0.0

Aqui está meu 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

E 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

E finalmente client.rb (ROR Model and Class):

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

Se for útil, meu arquivo 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
fonte
O que funcionou para mim foi remover a linha --require spec_helperde .rspec. Como já continha --require rails_helper, que estava sendo carregado depois spec_helper.
Yuri Ghensev

Respostas:

91

Seu spec_helperarquivo está faltando alguns comandos importantes. Especificamente, não inclui configuração / ambiente e inicialização rspec-rails.

Você pode adicionar as seguintes linhas ao início do seu spec/spec_helper.rbarquivo

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

ou você pode apenas correr

rails generate rspec:install

e substitua o seu spec_helperpor um gerado para uso com rspec-rails.

gmacdougall
fonte
30
As versões mais recentes do RSpec movem algumas coisas do spec/spec_helper.rbarquivo, então agora você também obtém um spec/rails_helper.rbarquivo. Se você rodar rails generate rspec:install, é isso que ele produz (rspec-rails 3.0.1, rails 4.1.1). Acontece que o rails_helper.rbarquivo contém algum código semelhante ao seu e deve ser necessário quando você deseja carregar o Rails em suas especificações.
Dennis
Dennis está no caminho certo. Eu acredito que a configuração dos testes que vão testar os recursos do Rails deve ser movida de spec_helper.rbpara rails_helper.rb. Além disso, certifique-se de ler os comentários rails_helper.rbque mencionam como rspec-railspode infer_spec_type_from_file_location, o que pode fazer você realocar seus testes de especificação em spec/*/subdiretórios diferentes .
Stephen Henderson
21
se quiser incluir spec/rails_helper.rbautomaticamente, você pode fazer isso .rspecadicionando--require rails_helper
schmijos
3
Mas não contribui --require rails_helperpara .rspecderrotar o ponto de separar os dois ajudantes. Eu acho que você sempre estará carregando rails_helper (e portanto Rails), mesmo para especificações que não precisam de Rails.
Jon Garvin
Isso ajudou muito. Na verdade, eu precisava atualizar meu .travis.ymlparabin/rspec
Peter Ehrlich
155

Em rails 4.x (rspec-rails 3.1.0) use

require "rails_helper"  # this

não

require "spec_helper"   # not this

em seus arquivos de especificações

Mark Swardstrom
fonte
2
Esta deve ser sua própria pergunta em algum lugar para fins de pesquisa; Tenho lutado com o que pensei ser Capivara quebrada, ou lançamento quebrado, ou quebrado (preencha a gema), e tudo foi devido a essa mudança de linha.
EthanK
requer "rails_helper" trabalhar nos trilhos 3.2.22 (rspec-rails 3.2.1)
shilovk
Isso foi super confuso. Estou construindo um novo aplicativo Rails 6 e executando minha primeira especificação. Definitivamente, ele estava carregando o arquivo rails_helper.rb, mas agora vejo que ele estava tentando carregá-lo depois de tentar executar a especificação. Adicionado require "rails_helper"ao topo da minha especificação e eu estava pronto para ir.
Travis
19

Você também pode adicionar --require rails_helperem seu .rspecarquivo para que tenha a seguinte aparência.

--color
--require spec_helper
--require rails_helper

Depois disso, você não precisará exigir rails_helper em todas as suas especificações.

Umang Raghuvanshi
fonte
2
Isso é ótimo se você precisa carregar o ambiente Rails para todos os testes, mas se não, eventualmente fará com que seu conjunto de testes fique mais lento do que deveria ser, como alguns mencionaram nos comentários em outra resposta acima.
Jamesmarkcook
8

Estou usando Rails 5.0.0.1.
Veja como resolvi essa preocupação.

Em seu Gemfile, adicione -> gem 'rspec-rails', "> = 2.0.0.beta"

Igual a,

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

Motivo: se o rspec-rails não for adicionado e quando você executar o comando rspec, ele irá gerar este erro -> "não é possível carregar esse arquivo - rails_helper"

Agora, execute este comando no terminal.

pacote de instalação

Uma vez que o comando do pacote funcionou bem, execute a geração dos rails. Igual a,

trilhos geram rspec: install

Motivo: este comando criará um novo .rspec (clique em substituir quando solicitado), spec / rails_helper.rb e spec / spec_helper.rb

Agora, neste ponto, o rspec deve funcionar corretamente.
No entanto, se você encontrar um erro onde o modelo não foi encontrado, por exemplo, não foi possível carregar esse arquivo - ideia , tente adicionar isso em cima de seu spec / spec_helper.rb

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

Motivo: parece que spec_helper não está carregando o ambiente Rails. Estamos exigindo isso.

Espero que isto ajude!

Kent Aguilar
fonte
2

As coisas mudaram um pouco desde que este thread foi criado, eu também experimentei o uninitialized constant ClassName (NameError)erro usando Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Resolvi meus problemas ao ler a documentação da gem rspec-rails:

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

onde confirma o que Swards diz sobre exigir "rails_helper" e não mais "spec_helper".

Além disso, a especificação do meu modelo se parece mais com a dos documentos do 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
Arnaud Bouchot
fonte
1

A pasta de fábricas define em seu aplicativo

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

  end
end

Seu arquivo Controller RSpec:

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

Se outras respostas a esta pergunta não funcionarem, tente:

  • Verifique se há algum erro de digitação no nome do arquivo ou nome da classe (eles devem corresponder)

De outra forma,

  • Verifique seu config/environment/test.rbarquivo, veja se há config.eager_load = false, defina-o como true.

Você deve verificar na ordem por escrito, pois não deseja resolver o problema com o erro de digitação ali.

Longfei Wu
fonte