ruby-on-rails - sheet - install factory bot rails
Probando el modelo de usuario con Rspec, Devise y Factory Girl (3)
El enfoque más simple de la OMI:
FactoryGirl.modify do
factory :user do
after(:build) { |u| u.password_confirmation = u.password = ... }
end
end
Creo que hay un problema con la construcción de mi fábrica de usuarios. Recibo un error que dice que la contraseña no puede estar en blanco, pero está claramente establecida en mis fábricas.rb. ¿Alguien ve algo que pueda faltar? ¿O una razón por la cual la especificación está fallando? Hago algo muy similar para uno de mis otros modelos, y parece ser exitoso. No estoy seguro de si el error está siendo causado por un dispositivo o no.
Error Rspec
User should create a new instance of a user given valid attributes
Failure/Error: User.create!(@user.attributes)
ActiveRecord::RecordInvalid:
Validation failed: Password can''t be blank
# ./spec/models/user_spec.rb:28:in `block (2 levels) in <top (required)>''
Fábricas.rb
Factory.define :user do |user|
user.name "Test User"
user.email "[email protected]"
user.password "password"
user.password_confirmation "password"
end
usuario_spec.rb
require ''spec_helper''
describe User do
before(:each) do
@user = Factory.build(:user)
end
it "should create a new instance of a user given valid attributes" do
User.create!(@user.attributes)
end
end
usuario.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
end
En Factory Girl, esto crea atributos:
@user_attr = Factory.attributes_for(:user)
Y esto crea una nueva instancia:
@user = Factory(:user)
Así que cambia lo anterior y prueba:
User.create!(@user_attr)
En profundidad, lo que intentas hacer falla porque:
estabas creando una nueva instancia no guardada
la contraseña es un atributo virtual
los atributos de la instancia no contienen los atributos virtuales (supongo)
Un consejo que hizo el trabajo por mí. Estaba usando FactoryGirl.create(:user)
que no funcionó. Se cambió a esto:
user = FactoryGirl.build(:user)
user.password = "123456"
user.save
post :login, {:email => user.email, :password => "123456"}
# do other stuff with logged in user
Esto quizás se deba a que ''contraseña'' es un campo virtual. Espero que esto pueda insinuar a alguien.