tutorial sheet rails factorybot cheat bot ruby-on-rails ruby rspec devise factory-bot

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.