Factory Girl has_many通过验证死锁

时间:2015-09-03 19:25:42

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

我有一个Listing模型has_many :categories, through: :categories_listingshas_many :categories_listings。我正在用Factory Girl工厂测试它,看起来像这样:

factory :listing do |f|
  f.sequence (:title) { |n| "Listing #{n}" }
  message {Faker::Lorem.paragraph}
  cards {[FactoryGirl.create(:card)]}
  categories {[FactoryGirl.create(:category)]}
  association :delivery_condition
  association :unit_of_measure
  quantity 1
  unit_price 1
end

在我向模型添加以下验证之前,一切正常:

validate :has_categories?

def has_categories?
  if self.categories_listings.blank?
    errors.add :base, "You have to add at least one category"
  end
end

现在每当我经营工厂时,我都会得到:

ActiveRecord::RecordInvalid: You have to add at least one category

我也尝试使用像before :create这样的Factory Girl回调,但问题是我无法添加关联,因为我还不知道回调中的列表ID。但我无法保存列表,因为验证是在关联之前运行的。

我如何解决这个问题并让它发挥作用?

1 个答案:

答案 0 :(得分:2)

让它发挥作用。

在我的工厂中,我删除了类别行并添加了before(:create)回调,建立关系。强调构建,因为它不适用于创建(我在发布问题之前尝试过)。加上构建绕过了我提到的僵局。所以现在,工作工厂看起来像这样:

factory :listing do |f|
  f.sequence (:title) { |n| "Listing #{n}" }
  message { Faker::Lorem.paragraph }
  cards { [FactoryGirl.create(:card)] }
  association :delivery_condition
  association :unit_of_measure
  quantity 1
  unit_price 1

  before(:create) do |listing|
    category = FactoryGirl.create(:category)
    listing.categories_listings << FactoryGirl.build(:categories_listing, listing: listing, category: category)
  end
end

this answer获得灵感。

相关问题