これは私の基本的な誤解かもしれません。アプリには、複数のテーブルからデータのセットを収集し、それらをメモリ構造に結合するロジックがたくさんあります。そのロジックのテストを書きたいです。
フィクスチャ、ファクトリーガール、および同様のツールがインメモリモデルインスタンスを構築しているように私には思えます。私がactiverecord呼び出しを行う場合、Model.find(foo: 12)
それらは保存されたレコードに対してのみ適用されますか?
これは私の基本的な誤解かもしれません。アプリには、複数のテーブルからデータのセットを収集し、それらをメモリ構造に結合するロジックがたくさんあります。そのロジックのテストを書きたいです。
フィクスチャ、ファクトリーガール、および同様のツールがインメモリモデルインスタンスを構築しているように私には思えます。私がactiverecord呼び出しを行う場合、Model.find(foo: 12)
それらは保存されたレコードに対してのみ適用されますか?
ほとんどの場合、私は @mrbrdo の意見に同意します: rpsec のスタブ方式を好みます。しかし、Rails プログラマーとして、「フィクスチャ」と「スタブ」の両方を知っておく必要があると思います。
フィクスチャは、yaml
ファイルまたは が何であれ、factory girl data
両方ともデータベースに保存されます。config/database.yml
それらの場所については、ファイルを参照してください。実際、これは、固定 ID を持つ「管理者ユーザー」など、テスト中に DB に常に何らかのデータがあることを確認したい場合に役立ちます。
スタブは、DB に保存されないためフィクスチャよりも高速であり、「フィクスチャ」では実装できないテストを実行する場合に非常に役立つ可能性があります。
したがって、実際のコーディング ライフで両方を試し、実際のコンテキストに応じてどちらかを選択することをお勧めします。
あなたが言っていることは真実ではありません.備品や工場の女の子がデータベースを使用します. フィクスチャは避けたいと思いますが、最近ではほとんど使用されていません。
ただし、実際にテストを作成する適切な方法は、activerecord 呼び出しをスタブ化することです。これにより、テストが大幅に高速化されます。テストしたいのは、データを構造に結合することであり、データベースからデータを引き出すことではありません。その部分は、activerecord のテストで既にテストされています。
したがって、次のようにファインダーをスタブ化します (rspec を使用している場合):
Model.should_receive(:find).with(foo: 12) do
Model.new(foo: 12, other_attribute: true)
end
したがって、テストしているメソッドが Model.find(foo: 12) を呼び出すと、取得されます
Model.new(foo: 12, other_attribute: true)
これは、データベースで実際に作成してから引き出すよりもはるかに高速であり、テストしているものに対してこれを行う意味はありません-重要ではありません. メソッドの実行内容に応じて、インスタンスなどにスタブ保存することもできます。DB からのデータの取得と DB への保存はすべて、activerecord のテストで既にテストされていることに注意してください。これらのテストをやり直す必要はありません。特定のロジックに集中するだけです。
FactoryGirl は、レコードをデータベースに保存する方法など、いくつかのビルド方法をサポートしています。
簡単です: fooFactoryGirl.create(:foo)
を作成してデータベースに保存しますが、そのオブジェクトのメモリ内バージョンのみを作成します。FactoryGirl.build(:foo)
ビルド戦略の詳細については、 https ://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.mdの「ファクトリーの使用」セクションを参照してください。