我在 Rails 中建模一个复杂的采购工作流程,将申请转换为订单。我正在使用 FactoryGirl 进行测试,一切都很好,直到我尝试测试 OrderLineItem,它取决于一个订单和一个报价,每个订单和报价都依赖于其他对象,等等......
有问题的测试检查受产品影响的 OrderLineItem 上的行为,产品是链上更高的几个关联。
有没有一种设置 FactoryGirl 的好方法,这样我就可以轻松地构建 OrderLineItems 并且还可以指定链中更高对象的行为,而无需一次分解每个对象?
这是我的对象图:
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
看似复杂的模型允许根据供应商的报价将购买“建议”转换为一个或多个实际订单,并且当物品到达时,它们会被赋予资产标签。然后可以将资产本身链接回订单和供应商,以便稍后提供支持。
这是我的 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 并控制它所依赖的 Product 的属性?