工厂女孩生成两个变量但 RecordNotUnique
Factory girl generate two variables but RecordNotUnique
我有一个User
模型class,我想生成两个实例变量来做一些测试。
let (:user) {FactoryGirl.create :user,:with_events}
let (:user1) {FactoryGirl.create :user,:with_events}
但是我得到了错误:
ActiveRecord::RecordNotUnique:
Mysql2::Error: Duplicate entry 'AlBw1S27GE6wQIgzHM2TmZxSaHXLbhuQIg08NyI98Cg' for key 'index_users_on_access_token': INSERT INTO `users`
I checked AlBw1S27GE6wQIgzHM2TmZxSaHXLbhuQIg08NyI98Cg is user1's access_token already. But why did user1 use the same **access_token**?
SecureRandom.urlsafe_base64(32) 似乎只调用了一次?为什么 access_token 不是唯一的?
PS:
factories.rb
FactoryGirl.define do |f|
factory :user do
password "123123"
sequence(:name){|n| "张三#{n}" }
access_token SecureRandom.urlsafe_base64(32)
expired Time.now + FSpace::USER_TOKEN_EXPIRED_TIMES
end
factory :event do
end_date "2015-05-30"
is_countdown "1"
start_date "2015-03-17"
sequence(:name){|n| "我的生日#{n}" }
end
trait :with_events do
after :create do |user|
FactoryGirl.create_list :event, 3, :user => user
end
end
end
使用您使用的语法,
access_token SecureRandom.urlsafe_base64(32)
该值仅在定义工厂时计算一次。
如果您希望每次使用工厂时都计算该值,那么您需要使用基于块的语法。
access_token { SecureRandom.urlsafe_base64(32) }
在文档中他们称之为 lazy attributes
我有一个User
模型class,我想生成两个实例变量来做一些测试。
let (:user) {FactoryGirl.create :user,:with_events}
let (:user1) {FactoryGirl.create :user,:with_events}
但是我得到了错误:
ActiveRecord::RecordNotUnique:
Mysql2::Error: Duplicate entry 'AlBw1S27GE6wQIgzHM2TmZxSaHXLbhuQIg08NyI98Cg' for key 'index_users_on_access_token': INSERT INTO `users`
I checked AlBw1S27GE6wQIgzHM2TmZxSaHXLbhuQIg08NyI98Cg is user1's access_token already. But why did user1 use the same **access_token**?
SecureRandom.urlsafe_base64(32) 似乎只调用了一次?为什么 access_token 不是唯一的?
PS:
factories.rb
FactoryGirl.define do |f|
factory :user do
password "123123"
sequence(:name){|n| "张三#{n}" }
access_token SecureRandom.urlsafe_base64(32)
expired Time.now + FSpace::USER_TOKEN_EXPIRED_TIMES
end
factory :event do
end_date "2015-05-30"
is_countdown "1"
start_date "2015-03-17"
sequence(:name){|n| "我的生日#{n}" }
end
trait :with_events do
after :create do |user|
FactoryGirl.create_list :event, 3, :user => user
end
end
end
使用您使用的语法,
access_token SecureRandom.urlsafe_base64(32)
该值仅在定义工厂时计算一次。
如果您希望每次使用工厂时都计算该值,那么您需要使用基于块的语法。
access_token { SecureRandom.urlsafe_base64(32) }
在文档中他们称之为 lazy attributes