web-dev-qa-db-ja.com

Factory Girl-目的は何ですか?

before(:each)ブロックを使用できる場合のrspecテストでのFactory Girlの目的は何ですか? Factory Girlとbefore(:each)の唯一の違いは、ファクトリがテスト外でオブジェクトの作成を準備することです。これは正しいですか?

60
curiousdork

Factory GirlSham のような宝石を使用すると、有効で再利用可能なオブジェクトのテンプレートを作成できます。それらは、データベースにロードする必要のある固定レコードを保持するフィクスチャに応じて作成されました。オブジェクトをインスタンス化するときにさらにカスタマイズでき、有効なオブジェクトを使用できるようにすることを目的としています。それらはテストのどこでも、またテスト前後のフックで使用できます。

before(:each)、before(:all)、after(:each)、after(:all)はすべて、テストグループ間で共有されるセットアップと分解を行う場所を提供することを目的としています。たとえば、テストごとに新しい有効なユーザーを作成する場合は、before(:each)フックでそれを実行する必要があります。ファイルシステムからいくつかのファイルをクリアする場合は、before beforeフックでそれを行います。すべてのテストでtmpファイルを作成し、テスト後にそれを削除する場合は、after(:each)またはafter(:all)フックで行います。

これら2つの概念の違いは、ファクトリーはテストの周囲にフックを作成することではなく、有効なRubyオブジェクトとレコードを作成することを目的としているため、オブジェクト作成を柔軟かつDRYに保つことができるということです前後のフックは、サンプルグループで共有されるセットアップおよびティアダウンタスクを目的としているため、セットアップおよびティアダウンコードをDRYに保つことができます。

63
Pan Thomakos

FactoryGirlは、テストでフィクスチャを置き換えます。この方法では、データモデルを変更するときにフィクスチャを最新の状態に保つ必要はありません。また、エッジケースを追加すると、フィクスチャが扱いにくくなる傾向があります。

FactoryGirlはその場でデータを生成し、フィールドの追加と削除ははるかに簡単です。また、フィクスチャをどのように使用するかをセットアップで使用できます。

それはそれを明確にしますか?

16
Srdjan Pejic

また、フィクスチャ定義はアプリケーション全体でグローバルです。ファクトリはローカルにすることができます-そのため、分離されたテストケースに固有のデータは、単一のグローバルフィクスチャファイルではなく、その特定のコンテキストのセットアップにあります。

この本 さらなる読み物が必要な場合、主題を非常によくカバーしています

6
John Beynon