使用子项存在验证Factory Girl创建父项和子项

时间:2016-04-25 18:09:30

标签: ruby-on-rails ruby unit-testing testing factory-bot

拥有一个包含许多旅行的发票的项目。我的新故事要求发票必须旅行。我已经添加了验证validates :trips, presence: true,但由于FactoryGirl在创建相关行程之前尝试保存发票,因此现在正在进行大量测试。

FactoryGirl.define do
  factory :invoice do
    sequence(:invoice_id) { SecureRandom.uuid}
    merchant
    amount 100.00
    item_count 1
    paid false
    currency "GBP"
    invoice_type "pre-flight"
    service_rendered false
    cancelled false

    after(:create) { |object| create(:trip, invoice_id: object.invoice_id)}
  end

end

我该怎么做才能创建这些对象。最好是在工厂级别,因为有许多测试利用这种行为(目前因此而失败。)This似乎是测试级别的一个很好的解决方案。

更新 现在还在努力让我的测试变绿。 42使用以下代码进行测试错误。

  

验证失败:旅行不能为空

我在FactoryGirl代码中的当前更新行

  before(:create) { |object| object << build(:trip, invoice_id: object.invoice_id)}

这是我的旅行工厂。

FactoryGirl.define do
  factory :trip do
    depart_airport "MCI"
    arrive_airport "ORD"
    passenger_first_name "Joe"
    passenger_last_name "Business"
    passenger_count 1
    departure_date {10.days.from_now}
    invoice
  end

end

立即行动 @andrykonchin是对的。我错过了before(:create)...

中的内容

before(:create) { |object| object.trips << build(:trip, invoice_id: object.invoice_id)}

1 个答案:

答案 0 :(得分:1)

before回调可能会对您有所帮助。

来自documentation

  

before(:create) - 在保存工厂之前调用(通过   FactoryGirl.create)

看起来像这样:

before(:create) { |object| object.details << build(:invoice_detail)}