我认为我的用户工厂正在构建中存在问题。我收到一个错误,说密码不能为空,但它明确地设置在我的workers.rb中。有没有人看到我可能遗失的任何东西?或者为什么规范失败的原因?我为其他一个模型做了一个非常类似的事情,它似乎很成功。我不确定错误是否是由设计引起的。
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)>'
Factory.define :user do |user|
user.name "Test User"
user.email "user@example.com"
user.password "password"
user.password_confirmation "password"
end
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
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
答案 0 :(得分:30)
在Factory Girl中,这会创建属性:
@user_attr = Factory.attributes_for(:user)
这会创建一个新实例:
@user = Factory(:user)
所以改变上面的内容并尝试:
User.create!(@user_attr)
深入地说,你要做的事情失败是因为:
您正在创建新的未保存实例
密码是虚拟属性
实例的属性不包含虚拟属性(我猜)
答案 1 :(得分:7)
最简单的方法IMO:
FactoryGirl.modify do
factory :user do
after(:build) { |u| u.password_confirmation = u.password = ... }
end
end
答案 2 :(得分:5)
为我做的工作的一个提示。我使用的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
这可能是因为'密码'是一个虚拟字段。希望这可能暗示某人。