如何在 Factory Girl 中创建 has_and_belongs_to_many 关联

125

考虑以下情况

class User < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :users
end

如何为公司和用户定义具有双向关联的工厂?这是我的尝试

Factory.define :company do |f|
  f.users{ |users| [users.association :company]}
end

Factory.define :user do |f|
  f.companies{ |companies| [companies.association :user]}
end

现在我尝试

Factory :user

或许并不令人意外,这将导致无限循环,因为工厂递归地使用彼此来定义自己。

更令人惊讶的是,我在任何地方都没有找到如何解决此问题的提及,是否存在定义必要工厂的模式,或者我正在做一些根本性错误?

11个回答

-1

您可以定义新的工厂并使用after(:create)回调来创建关联列表。让我们看看在这个例子中如何实现:

FactoryBot.define do

  # user factory without associated companies
  factory :user do
    # user attributes

    factory :user_with_companies do
      transient do
        companies_count 10
      end

      after(:create) do |user, evaluator|
        create_list(:companies, evaluator.companies_count, user: user)
      end
    end
  end
end

属性 companies_count 是一个瞬态属性,可在工厂的属性和通过评估器的回调中使用。现在,您可以创建一个带有公司的用户,并选择指定您想要的公司数量:

create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接