1

フィクスチャを使用しているRails3アプリをFactoryGirlに移動しようとしていますが、データベースへの適切なアプローチが完全にはわかりません。(テストにはRspecを使用していることに注意してください)。

機能テストと統合テストにseeds.db必要なデータがあるのですが、たとえば、モデルのモデルテストに関してはRole、工場から管理者の役割を作成したい場合、このシードされたデータが邪魔になる可能性があります、しかし、私のシードのデータベースにはすでに管理者の役割があり、名前の列は一意である必要があります。さらに、これらのモデルテストで作成したデータは、予期しない追加のデータがあるため、統合テストに干渉する可能性があります。

だから私が推測するいくつかの質問:

  1. 単体テストでデータベースを処理する適切な方法は何ですか?他のテスト用にシードされたデータが必要ですが、現在「邪魔になっている」ようです。シーケンスを使用して一意のデータを作成する必要がありますか、それとも機能テストや統合テストなどのためだけにシードデータをロードする方法はありますか?

  2. ファクトリデータをクリアして、機能テストと統合テストのシードデータだけにする適切な方法はありますか?

ファクトリーガールは今のところまったく新しいので、ハッキングするのではなく、適切に学びたいと思っています。ご入力いただきありがとうございます。

4

1 に答える 1

3

テストでデータベースデータを処理する「適切な」方法は、すべてのテストを実行する前に、データベースデータがクリーンで一貫していることを確認することです。非常に多くの人(私自身を含む)は、データベースをシードせず、代わりにファクトリを使用します。

また、データベースにシードを設定すると、何が起こっているのかを知ることが難しくなり、多くの場合、誤った仮定を立てることになります。代わりに、ファクトリを使用して、テストに必要なデータのみを追加します。少し余分な作業ですが、次の理由で価値があります。

  1. あなたの仮定を取り除きます
  2. クリーンで一貫性のあるテスト環境を保証します
  3. テストのすべてのデータをテストに正しく保持します

さらに、rspecには、テストを実行する前にデータをセットアップできる機能がbefore(:each)あります。before(:all)ですから、それほど余分な作業ではありません。

しかし、最初につまずくかもしれないことの1つは、rspecを使用すると、テストの実行間でデータベースがクリアされないという事実です。before(:all)そのために、私は通常、ブロック内で手動で削除しafter(:all)ます。したがって、私が使用する経験則は次のとおりです。で作成されたものはすべて、before(:all)で削除する必要があります。after(:all)

多くの人がこれにdatabase_cleanergemも使用していますが、これまでのところ私はそれを必要としませんでした。

于 2012-07-10T23:36:32.357 に答える