要求を注文に変換する複雑な購入ワークフローを Rails でモデル化しています。私は FactoryGirl を使用してテストを行っていますが、OrderLineItem をテストしようとするまではすべて順調ですが、OrderLineItem は Order と Quote に依存し、それぞれが他のオブジェクトに依存しています...
問題のテストは、製品の影響を受ける OrderLineItem の動作をチェックします。これは、チェーンの上位にあるいくつかの関連付けです。
OrderLineItems を簡単に作成できるように FactoryGirl をセットアップする良い方法はありますか? また、各オブジェクトを一度に 1 つずつ因数分解することなく、チェーンの上位にあるオブジェクトの動作を指示することもできますか?
これが私のオブジェクトグラフです:
class Requisition
has_many :requisition_line_items
has_many :orders
end
class RequisitionLineItem
belongs_to :requisition
belongs_to :product
has_many :quotes
end
class Quote
belongs_to :line_item
belongs_to :vendor
has_one :order_line_item
end
class Order
belongs_to :requisition
belongs_to :vendor
has_many :order_line_items
end
class OrderLineItem
belongs_to :order
belongs_to :quote
has_many :assets
end
class Asset
belongs_to :order_line_item
belongs_to :product
end
class Product
has_many :assets
end
class Vendor
has_many :orders
end
一見複雑なモデルにより、購入の「提案」を、ベンダーからの見積もりに基づいて 1 つまたは複数の実際の注文に変換できます。商品が到着すると、資産タグが付与されます。その後、アセット自体を注文とベンダーにリンクして、後でサポートすることができます。
これは私の OrderLineItem 仕様であり、かなり簡潔なセットアップがあります。
describe '#requires_tag?' do
let(:product) { FactoryGirl.create :product, requires_tag: false }
let(:purchase_requisition) { FactoryGirl.create :purchase_requisition }
let(:line_item) { FactoryGirl.create :line_item,
purchase_requisition: purchase_requisition,
product: product }
let(:quote) { FactoryGirl.create :quote,
line_item: line_item, unit_price: 0 }
subject { FactoryGirl.build :order_line_item, quote: quote }
context 'when neither product nor price require a tag' do
its(:requires_tag?) { should be_false }
end
context 'when product requires a tag' do
let(:product) { FactoryGirl.create :product, requires_tag: true }
its(:requires_tag?) { should be_true }
end
end
無数のステートメントが本当に必要なのlet
か、それとも OrderLineItem を構築し、それが依存する製品の属性を制御するより良い方法があるのか?