Ruby on rails 创建具有子状态验证工厂女孩的父级和子级

Ruby on rails 创建具有子状态验证工厂女孩的父级和子级,ruby-on-rails,ruby,unit-testing,testing,factory-bot,Ruby On Rails,Ruby,Unit Testing,Testing,Factory Bot,有一个项目,有许多旅行发票。我接到了一个新的消息,要求发票必须有一次旅行。我添加了一个validationvalidates:trips,presence:true,但现在它破坏了我的许多测试,因为FactoryGirl试图在创建关联的trip之前保存发票 FactoryGirl.define do factory :invoice do sequence(:invoice_id) { SecureRandom.uuid} merchant amount 100.00

有一个项目,有许多旅行发票。我接到了一个新的消息,要求发票必须有一次旅行。我添加了一个validation
validates:trips,presence:true
,但现在它破坏了我的许多测试,因为FactoryGirl试图在创建关联的trip之前保存发票

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
如何创建这些对象。最好是在工厂级别,因为有许多测试利用了这种行为(目前由于它而失败)。在测试级别上,这似乎是一个很好的解决方案

更新 现在还在努力让我的测试变绿。42个测试出错,代码如下

验证失败:Trips不能为空

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

  before(:create) { |object| object << build(:trip, invoice_id: object.invoice_id)}
正在工作 @安德里康钦是对的。我以前(:create)的
中遗漏了一些内容。


before(:create){| object | object.trips
before
回调可能对您有所帮助

从:

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

它看起来是这样的:

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

before(:create){| object | object.details在创建父对象之前,是否可以使用父对象id创建子对象?@CheeseFry,可以,但数据库中的外键约束将阻止它。不应创建,只需构建子模型并将其添加到(父模型)中即可关联;当您保存父模型(发票)时,新的子模型也将被保存,就像在我的示例中一样,对吗?更新了上面的代码,使其工作正常。感谢您的示例!
before(:create) { |object| object.details << build(:invoice_detail)}