使用 FactoryBot,我无法在我的规范中创建管理员工厂,因为在before_create
回调中为每个用户分配了默认用户角色。这意味着当回调发生时,我分配工厂的任何角色都将更改为用户。
我真正想做的是这样的:
在我的规格内
admin = FactoryBot.create(:user)
admin.role = 'admin'
第二行,admin.role = 'admin'
什么都不做。有任何想法吗?
我也愿意接受更好的方法来做到这一点。
使用 FactoryBot,我无法在我的规范中创建管理员工厂,因为在before_create
回调中为每个用户分配了默认用户角色。这意味着当回调发生时,我分配工厂的任何角色都将更改为用户。
我真正想做的是这样的:
在我的规格内
admin = FactoryBot.create(:user)
admin.role = 'admin'
第二行,admin.role = 'admin'
什么都不做。有任何想法吗?
我也愿意接受更好的方法来做到这一点。
可能有一种方法可以将值重新分配给 FactoryBot(以前的 FactoryGirl)实例,但 RSpec 否定了这种需要:
describe User do
let(:user) { FactoryBot.create(:user) }
context 'when admin' do
let(:user) { FactoryBot.create(:user, admin: true) }
# ...
end
end
尝试使用trait
:
factory :user do
sequence(:username) { |n| "User ##{n}"}
role 'user'
trait :is_admin do
role 'admin'
end
end
用法:
FactoryBot.create(:user, :is_admin)
或者最终一个after(:create)
:
factory :user do
sequence(:username) { |n| "user ##{n}"}
role 'user'
end
factory :user_admin, class: User do
after(:create) { |user| user.role = 'admin'; user.save } # don't know if the .save is necessary here
sequence(:username) { |n| "User Admin ##{n}"}
end
只是另一种方式
# Steal some code from MrYoshiji at first.
factory :user do
sequence(:username) { |n| "User ##{n}"}
role 'user'
# Then a separate factory inside
factory :admin do
role 'admin'
end
end
# Use
FactoryBot.create(:admin)