我有两个相互依赖的模型是有效的。如何为他们创建有效的工厂?

时间:2018-03-28 14:20:28

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

我有Survey模型和Question模型,如下所示。 Survey必须至少有1 QuestionQuestion必须属于以下所示的Survey

class Survey < ActiveRecord::Base
  has_many :questions, class_name: 'Question', inverse_of: :survey

  validates :title, presence: true, length: { maximum: 200 }
  validates_length_of :questions, maximum: 100, minimum: 1
end

class Question < ActiveRecord::Base
  belongs_to :survey, class_name: 'Survey', inverse_of: :questions

  validates :title, presence: true, length: { maximum: 200 }
  validates :survey, presence: true
end

当我写下工厂时,如下所示,我会得到一个StackOverflow错误,因为Survey会在创建后构建一个Question,而Question会在创建后构建一个Survey,导致无限循环。

FactoryBot.define do
  factory :question, class: Question do
    association :survey, factory: :survey
    title  { Faker::Lorem.characters(10) }

  end
end

FactoryBot.define do
  factory :aya_pg_portfolio_survey_survey, class: Survey do
    after(:build) do |survey|
      survey.questions = build_list(question, 5)
    end

    title { Faker::Lorem.characters(10) }
  end
end

然后我想删除问题工厂中的调查关联或删除调查工厂中的after(:build)回拨。但这会导致工厂无效。

似乎应该有一个简单的方法来解决这个问题,因为我只有两个模型,简单需要另一个,但我被卡住了......

1 个答案:

答案 0 :(得分:1)

为什么调查工厂没有调查工厂就指向问题工厂?

FactoryBot.define do
  factory :question do
    title  { Faker::Lorem.characters(10) }
    survey nil

    factory :question_and_survey do
      survey
    end
  end
end

这确实意味着此create(:question_and_survey)会在调查中返回一个问题,其中包含6个问题。总比没事好吧?

但是就你的问题发表评论,你真的应该考虑允许创建一个空的调查。它的毛发拉得差不多。

Reference to inheritance in factorybot