3

私は現在、FactoryGirlとRspecを使用してモデルをテストしています。これは素晴らしいですが、信じられないほど遅いです。モデルごとに私が持っている何百ものテストは、モデルごとに実行するのに約30秒かかります。

中心的な問題は、テストするオブジェクトを作成するときに、FactoryGirl.create()メソッドを使用していることです。これはDBに影響し、buildまたはを使用するよりも明らかに低速ですbuild_stubbed。しかし、buildを使用するだけでは、データベース権でエラーが発生したかどうかはわかりません(null以外として指定した列にnull値を書き込もうとした場合など)。

両方の世界を最大限に活用する方法はありますか?または、モデル/単体テスト以外の場所でDB統合部分を明示的にテストする必要がありますか?

4

3 に答える 3

2

これがあなたのケースに当てはまるかどうかはわかりませんが、スイートをより速く実行するために spec_helper.rbを微調整することを検討しましたか?

この StackOverflow の回答でspec_helper.rbファイルの進化を文書化しました(具体的には編集 4 を参照)。そこにリストされている他の SO 回答とブログへのリンクは、スイートの実行時間を短縮するのに大いに役立ちました。

于 2013-02-01T03:40:40.363 に答える
0

私は FactoryGirl.build を使用するか、単に.newモデル スペックでインスタンスを作成し、永続化されたインスタンスを必要とする何らかの動作をテストでチェックする必要がある場合にのみインスタンスを保存します。

これは、行 ID が存在する必要がある関連付けまたは結合を使用する場合に問題になる可能性があります。これはトレードオフのようなものです。高速なテストと、書きやすいテストです。

于 2013-02-01T03:15:16.350 に答える
0

ほとんどの場合ビルドを使用する必要があります。一部の値がnullとして保存されないようにしたいのですが、そのためにいくつかの仕様を実行します。常にデータベース上にオブジェクトを作成するのは意味がありません

ファクトリが有効なオブジェクトを一度作成することをテストすると、ファクトリが常に有効なオブジェクトを作成することを信頼できます。

また、null/nil にできないフィールドでは常にプレゼンス検証を使用してください。フィールドが nil でない場合は、データベースに null 値が含まれていないことを確認できます。

于 2013-02-01T12:05:36.077 に答える