如何在factorygirl中建立依赖工厂

时间:2019-01-04 06:04:56

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

在我的应用程序中。我有模型-订单has_many order_items,发票has_many invoice_items。我正在为order和order_items创建工厂,如下所示:-

订单工厂:-

FactoryGirl.define do
  factory :order do 
    booked_at {Date.current}
    approved_at {Date.current}
    state "draft"
    customer
    user
    notes "NOTE !!!"
    ip_address "127.0.0.1"
    approver_id 1
    channel "mobile"

    transient do
      order_items_count { 5 }
    end

    order_items_attributes do
      attributes = []
      order_items_count.times do 
        # We are not using attributes_for(:order_item) below as attributes_for do not generate attributes for association (varint in this case)
        attributes << attributes_with_foreign_keys_for(:order_item)
      end
      attributes
    end

    after(:build) do |order|
      order.customer.reload # Do not remove this, if you remove this customer.default_address and customer.shipping_address etc won`t show up in customer.addresses
      order.shipping_address = FactoryGirl.build(:customer_address, customer_id: order.customer_id)
      order.billing_address = FactoryGirl.build(:customer_address, customer_id: order.customer_id)
    end
  end
end

OrderItem工厂:-

FactoryGirl.define do
  factory :order_item do
    association :variant, factory: :product
    booked_quantity 10
    price 50
  end
end

现在,当我创建发票和发票项目工厂时,我遇到了一个问题,即发票项目取决于订单项目。就像创建第一个订单一样,只有然后才能创建发票。

发票工厂:-

FactoryGirl.define do
  factory :invoice do
    date "2018-03-05"
    due_date "2018-03-05"
    user
    invoice_term

    transient do
      invoice_items_count { 5 }
    end

    invoice_items_attributes do
      attributes = []
      invoice_items_count.times do 
        # We are not using attributes_for(:invoice_item) below as attributes_for do not generate attributes for association (varint in this case)
        attributes << attributes_with_foreign_keys_for(:invoice_item)
      end
      attributes
    end

    after(:build) do |invoice|
        @order = create(:order, state: "confirm")
        @customer_id = @order.customer_id 
        invoice.customer_id = @customer_id
      end
  end
end

发票项目工厂:-

FactoryGirl.define do
  factory :invoice_item do
    variant_id 1
    order_item_id 1
    quantity "9.99"
    price "9.99"
    item_total "9.99"
    discount_total "9.99"
    tax_total "9.99"
    tax_category_id 1
  end
end

现在,在我的发票项目工厂中,我将variant_id 1,order_item_id 1放入其中,它应该来自已创建的order_item(而不是每个invoice_item为1)。我怎样才能做到这一点?

0 个答案:

没有答案