Тестирование модели пользователя с помощью Rspec, Devise и Factory Girl
Я думаю, что существует проблема с созданием моего пользователя factory. Я получаю сообщение о том, что пароль не может быть пустым, но он явно установлен на моих фабриках .rb. Кто-нибудь видит что-то, что я могу потерять? Или причина в том, почему спецификация не работает? Я делаю очень схожую вещь для одной из моих других моделей, и она кажется успешной. Я не уверен, что ошибка вызвана разработкой или нет.
Ошибка 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)>'
Factories.rb
Factory.define :user do |user|
user.name "Test User"
user.email "[email protected]"
user.password "password"
user.password_confirmation "password"
end
user_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
user.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
Ответы
Ответ 1
В Factory Девушка, создайте атрибуты:
@user_attr = Factory.attributes_for(:user)
И это создаст новый экземпляр:
@user = Factory(:user)
Итак, измените это и попробуйте:
User.create!(@user_attr)
В глубине, то, что вы пытаетесь сделать, терпит неудачу, потому что:
-
вы создавали новый несохраненный экземпляр
-
пароль - это виртуальный атрибут
-
атрибуты экземпляра не содержат виртуальных атрибутов (я думаю)
Ответ 2
Самый простой подход IMO:
FactoryGirl.modify do
factory :user do
after(:build) { |u| u.password_confirmation = u.password = ... }
end
end
Ответ 3
Один совет, который сделал для меня работу. Я использовал FactoryGirl.create(:user)
, который не работал. Изменилось это:
user = FactoryGirl.build(:user)
user.password = "123456"
user.save
post :login, {:email => user.email, :password => "123456"}
# do other stuff with logged in user
Возможно, это связано с тем, что "пароль" - это виртуальное поле. Надеюсь, это может намекнуть на кого-то.