如何在工厂女孩中创建关联记录以在创建时通过验证

How to create an associated record within factory girl to pass validations at creation

我对 FactoryGirl 知之甚少,只创建过没有关联的单记录工厂。这是我现在有两个关联模型的工厂:

factory :help_request do
    name "Mrs. Bourque's holiday party"
    description "We need volunteers to help out with Mrs. Bourque's holiday party."
end

factory :donation_item do
    name "20 Cookies"
end

每当我需要关联两条记录时,我都会在 rspec 中使用如下代码进行关联:

require 'spec_helper'

describe HelpRequest do
  let(:help_request) { FactoryGirl.create(:help_request) }
  let(:donation_item) { FactoryGirl.create(:donation_item) }

  subject { help_request }

  before {
    donation_item.help_request_id = help_request.id
    donation_item.save!
  }

通常这是有效的,但现在我确认至少有一个 donation_item 尚未标记为销毁:

class HelpRequest < ActiveRecord::Base      has_many :events
  has_many :donation_items, dependent: :destroy
  validate :check_donation_items?

  def has_donation_items?
    self.donation_items.collect { |i| !i.marked_for_destruction? }.any?
  end

  def check_donation_items?
    if !has_donation_items?
      errors.add :a_help_request, "must have at least one item."
    end
  end

当我 运行 我的模型测试时,一切都失败了:

 Failure/Error: let(:help_request) { FactoryGirl.create(:help_request) }
 ActiveRecord::RecordInvalid:
   Validation failed: A help request must have at least one item.

如何在 help_request 创建时关联工厂中的捐赠项目?我看到其他似乎相关的答案,但由于我对 FactoryGirl 的了解非常初级,所以我无法弄清楚如何让它发挥作用。

factory :donation_item do
    name "20 Cookies"
    help_request
end

factory :help_request do
    name "Mrs. Bourque's holiday party"
    description "We need volunteers to help out with Mrs. Bourque's holiday party."
end

那么在你的规范中:

let(:donation_item) { FactoryGirl.create(:donation_item, help_request: FactoryGirl.create(:help_request)) }

编辑 不要在 :donation_item 工厂中包含 help_request 关联,并在你的测试中这样做:

let(:help_request) do
  help_request = build(:help_request)
  help_request.donation_items << build(:donation_item)
  help_request.save!
  help_request
end

subject { help_request }