ruby-on-rails - validates - rails validations message
Rspec no ve mi modelo Class. error constante no inicializado (6)
Estoy escribiendo pruebas en Rspec para mis modelos en la aplicación Ruby on Rails. Y recibo este error al iniciar ''espec. Rspec''
command:
/spec/models/client_spec.rb:4:in `<top (required)>'': uninitialized constant Client (NameError)
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 (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
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
En el uso de rieles 4.x (rspec-rails 3.1.0)
require "rails_helper" # this
no
require "spec_helper" # not this
en tus archivos de especificaciones
Estoy usando Rails 5.0.0.1.
Así es como resolví esta preocupación.
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
Motivo: si rspec-rails no se agrega y cuando ejecuta el comando rspec, generará este error -> "no se puede cargar ese archivo - rails_helper"
Ahora, ejecuta este comando en la terminal.
paquete de instalación
Una vez que el comando bundle salió bien, ejecuta los carriles generate. Al igual que,
los rieles generan rspec: instalar
Motivo: este comando creará un nuevo .rspec (sobrescriba cuando se le solicite), spec / rails_helper.rb y spec / spec_helper.rb
Ahora, en este punto, rspec debería funcionar bastante bien.
Sin embargo, si encuentra un error en el que no se encuentra el modelo, por ejemplo , no puede cargar dicho archivo, idea , intente agregarlo encima de su espec. / 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 Rails. Lo estamos requiriendo
¡Espero que esto ayude!
La carpeta de fábricas define 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
Las cosas se han movido un poco desde que se creó este subproceso, también he experimentado el error de uninitialized constant ClassName (NameError)
usando Ruby 2.1, Rails 4.2, rspec-rails 3.3.
He resuelto mis problemas al leer la documentación de la gema rspec-rails:
https://github.com/rspec/rspec-rails#model-specs
donde confirma lo que dice Swards sobre la necesidad de "rails_helper" y no de "spec_helper".
También 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
Su archivo spec_helper
falta algunos comandos importantes. Específicamente, no incluye config / environment e inicializa rspec-rails
.
Puede agregar las siguientes líneas al comienzo de su archivo spec/spec_helper.rb
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 sobrescribe su spec_helper
con uno generado para uso con rspec-rails
.
También es posible que --require rails_helper
agregar --require rails_helper
en su archivo .rspec
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.