创建记录后更改Factory上的属性

时间:2013-10-09 15:33:23

标签: ruby-on-rails rspec factory-bot

使用FactoryBot,我在规范中创建管理工厂时遇到问题,因为在before_create回调中为每个用户分配了默认的用户角色。这意味着在回调发生时,我分配工厂的任何角色都将更改为用户。

我真正想做的是这样的事情:

在我的规范中

admin = FactoryBot.create(:user)
admin.role = 'admin'

第二行admin.role = 'admin'没有做任何事情。有任何想法吗?

我也愿意接受更好的方法。

3 个答案:

答案 0 :(得分:3)

尝试使用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

答案 1 :(得分:2)

可能有一种方法可以将值重新分配给FactoryBot(以前的FactoryGirl)实例化,但RSpec否定了这一需求:

describe User do
  let(:user) { FactoryBot.create(:user) }

  context 'when admin' do
    let(:user) { FactoryBot.create(:user, admin: true) }

    # ...
  end
end

答案 2 :(得分:2)

另一种方式

# 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)