如何在FactoryGirl中创建一个关联,并使用另一个FactoryGirl关联延迟评估的值

Sim*_*tti 5 ruby ruby-on-rails factory-bot

是否可以使用关联作为特征中另一个关联的值?

让我描述一个(简化的)例子.我有3个型号

  • User
  • Forum(belongs_to :forum)
  • Thread(belongs_to :forum,belongs_to :user)

请注意,Thread包含一个user_id,它不属于User通过Forum(目前,我不能改变这种约束).

我想知道的是,是否有办法定义像这样的特征

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      association :user
      # Lazy-evaluate the value of user to the previously created factory
      # THIS IS THE KEY POINT: I want 'user' to be the factory created at the previous line
      association :forum, user: user
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

该特性应该做的是创建一个用户并将其与线程相关联.然后它应该创建一个论坛,但用户应该是先前创建的同一个实例.

主要有两个原因:

  • 与论坛关联的用户与线程相同
  • 我不想在级联上创建两个用户工厂

任何的想法?我试图使用延迟评估,但无法将其与关联一起使用.

Joe*_*ris 2

做相反的事情并将线程的用户设置为与论坛的用户相同是否有意义?论坛工厂是否创建用户?

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      forum
      user { forum.user }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

如果你真的想以其他方式做到这一点,你绝对可以使用惰性属性:

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      user
      forum { create(:forum, user: user) }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

缺点是无论用于构建线程的策略如何,它总是会创建一个论坛。