FactoryGirl创建复杂工厂的标准方法(模型耦合关注)

时间:2016-07-12 02:20:34

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

因此,我正在使用复杂的代码库,使用RSpec和FactoryGirl在Rails 4中完成的许多ERP解决方案模型。幸运的是,它有很多测试,不是理想的,而是合理的数字。其中一个困难点始终是复杂的工厂设置。例如,要创建一个简单的发票,我们必须做很多工作:

product = create(:product, business: test_business, price: 100)
activity = create(:activity, business: test_business)
create(:sales_point, business: test_business, fiscal_number: 1)
user = create(:user)
Invoice.create!(business: test_business,
                sales_point: 1,
                invoice_type: InvoiceType::INVOICE_B,
                receptor_fiscal_category: FiscalCategory::BUSINESS_A,
                details: [InvoiceDetail.new( product: product,
                                             description: product.name,
                                             unitary_amount: 100,
                                             quantity: 1,
                                             amount: 100,
                                             activity: activity)],
                total_net: 100,
                total_tax: 21,
                total_amount: 121,
                created_by: user,
                updated_by: user)

这只是为了创建一个简单的测试发票!我知道Thoughtbots,FactoryGirl的创造者,实际上主张不要让同一个模型的多个工厂或太多的复杂性。而且我可以理解为什么......当你开始在工厂上做太多的魔法时,它们会与你的测试结合得太多......突然你改变了一些东西并且爆炸......数百个测试开始失败。

因此,我们不是改变东西,或者试图“过于聪明”......我们最终为复杂模型(例如Invoice)提供了5-10个版本的工厂(例如invoce_by_total_ammount,invoice_by_product_list,invoice_cash等)。

问题是,如果您曾经使用过像这样的大型代码库(100~模型),那么处理这种复杂设置以创建测试对象的标准方法是什么?这是多么的成功?

1 个答案:

答案 0 :(得分:0)

我建议在函数中包装该代码块,并将所需的发票类型作为参数传递。

这些类型的函数可以放在一个帮助文件中,该文件可以包含在Rspec.configure块中,以便它可用于所有测试。