5

要求を注文に変換する複雑な購入ワークフローを 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 を構築し、それが依存する製品の属性を制御するより良い方法があるのか​​?

4

2 に答える 2

1

1 つのことをテストしているように、これをリファクタリングしてみてください。そうしている場合は、これらすべてのオブジェクトを作成する必要はありません (その結果、テストが遅くなります)。

LoD、 https://www.google.com/search?q=law+of+demeter&ie=UTF-8&oe=UTF-8&hl=en&client=safari#itp=open0に違反していない場合、これはずっと簡単になります。

実際の関係を作成する代わりに、必要に応じて、関連するオブジェクトで呼び出しているメソッドをスタブできるはずです。

于 2013-05-11T02:11:21.637 に答える