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
ruby-on-rails
testing
model
rspec
Stan
fonte
fonte
--require spec_helper
de.rspec
. Como já continha--require rails_helper
, que estava sendo carregado depoisspec_helper
.Respostas:
Seu
spec_helper
arquivo está faltando alguns comandos importantes. Especificamente, não inclui configuração / ambiente e inicializaçãorspec-rails
.Você pode adicionar as seguintes linhas ao início do seu
spec/spec_helper.rb
arquivoENV["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_helper
por um gerado para uso comrspec-rails
.fonte
spec/spec_helper.rb
arquivo, então agora você também obtém umspec/rails_helper.rb
arquivo. Se você rodarrails generate rspec:install
, é isso que ele produz (rspec-rails 3.0.1, rails 4.1.1). Acontece que orails_helper.rb
arquivo contém algum código semelhante ao seu e deve ser necessário quando você deseja carregar o Rails em suas especificações.spec_helper.rb
pararails_helper.rb
. Além disso, certifique-se de ler os comentáriosrails_helper.rb
que mencionam comorspec-rails
podeinfer_spec_type_from_file_location
, o que pode fazer você realocar seus testes de especificação emspec/*/
subdiretórios diferentes .spec/rails_helper.rb
automaticamente, você pode fazer isso.rspec
adicionando--require rails_helper
--require rails_helper
para.rspec
derrotar 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..travis.yml
parabin/rspec
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
fonte
require "rails_helper"
ao topo da minha especificação e eu estava pronto para ir.Você também pode adicionar
--require rails_helper
em seu.rspec
arquivo 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.
fonte
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.
Uma vez que o comando do pacote funcionou bem, execute a geração dos rails. Igual a,
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!
fonte
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
fonte
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
fonte
Se outras respostas a esta pergunta não funcionarem, tente:
De outra forma,
config/environment/test.rb
arquivo, veja se háconfig.eager_load = false
, defina-o comotrue
.Você deve verificar na ordem por escrito, pois não deseja resolver o problema com o erro de digitação ali.
fonte