2016-07-12 9 views
0

RSpecとFactoryGirlを使用してRails 4で行われたERPソリューションのモデルがたくさんある複雑なコードベースで作業しています。幸いにも、それは理想的ではありませんが、合理的な数ではなく、多くのテストをしています。苦労している点の1つは、常に複雑な工場のセットアップでした。たとえば、簡単な請求書を作成するには、多くの作業が必要です。複雑なファクトリを作成するFactoryGirlの標準的な方法(モデル結合に関する懸念)

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は、実際には同じモデルの複数の工場や複雑すぎることに反対しています。そして、なぜ、あなたが工場であまりにも多くの魔法をやるようになると、彼らはあなたのテストに結びつきすぎて、突然何かを変えて、何百ものテストが失敗することを理解することができます。

これを変更するか、「あまりにもスマート」にするのではなく、Invoice(例:invoce_by_total_ammount、invoice_by_product_list、invoice_cashなど)のような複雑なモデルの工場が5~10バージョンになりました。

(100〜モデル)のような大きなコードベースで作業したことがある人は、を試してみてください。このような複雑なセットアップを扱う標準的な方法は何ですか?それはどれくらい成功したのですか?

+0

これはすべて正常に見えます。 factory_girlの標準的なアプローチは、関連するオブジェクトを自動的に作成する請求書ファクトリを作成することです。あなたはそれを試しましたか?それはあなたのためにうまくいきましたか? factory_girlに複数のアソシエーションに対して同じ過渡的な依存関係を使用させるには、いくつかの具体的な手引きが必要ですが、それが問題であるかどうかは私には分かりません。 –

+0

はい、私たちはそれを行いました。しかし、異なるテストでは、インボイス生成モデルに異なる調整が必要で、工場に非常に結合し始めました。また、約5-6種類の請求書ファクトリで終了しました。 –

+0

恐らく、工場のいくつかのバージョンを表示し、それらを統合する方法を尋ねるべきでしょう。 –

答えて

0

このコードブロックを関数にラップし、必要な請求書のタイプをパラメータとして渡すことをお勧めします。

これらのタイプの関数をヘルパーファイルに入れることができ、そのファイルをRspec.configureブロックに含めてすべてのテストで利用できるようにすることができます。

+0

そこに関連するデータがありますので、テストを変更する必要があります。私は8-10の機能を工場と同じにします。それでも私は "そこにいて、それをやった"と答えています。申し訳ありません。 –

+0

コードベースでも同様のアプローチを使用します。残念ながら、実際のコードを共有することはできませんが、一般的な考え方では、作成するキャンペーンの「タイプ」と関連する商品、オーダー、オーダーアイテムを渡すことです。私たちが使用するさまざまな属性は、キャンペーンのタイプ、キャンペーンの状態、注文の状態、注文アイテムの数量です。 –

+0

これで、工場の上に一種のファクトリメソッドメソッドが完成しました。これは、複雑な工場よりも厄介なコールバックを持つものよりもきれいである可能性があります。 –

関連する問題