2

私はFactoryGirlを使用してモデルのメモリ内スタブを構築し、すべてのActiveRecordクエリをそれらのモデルに対してのみ実行したいと考えています。例:RSpecテストでデータベースの使用を完全に避けるにはどうすればよいですか?

# Assume we start with an empty database, a Foo model, 
# and a Foo factory definition. 

#foo_spec.rb 
stubbed_foo = FactoryGirl.build_stubbed(:foo) 

# Elsewhere, deep in the guts of application 
Foo.first() # Ideally would return the stubbed_foo we created 
      # in the test. Currently this returns nil. 

解決策は、メモリ内のデータベースを使用することです。しかし、上記のシナリオは可能ですか?

+0

テーブルがない場合は、モデルのスキーマがないため、スタブされたモデルは実際のスキーマと一致することなく任意のオブジェクトのように動作する可能性があります。生産に存在します。これはおそらく悪い考えです。なぜこのようにActiveRecordをバイパスしようとしていますか? –

+0

ファクトリーガールの代わりにフィクスチャを使うことができました – trueinViso

+0

@trueinViso Fooクラスは 'first()'やその他のクエリメソッドを呼び出すときにデータベースに移動するので、フィクスチャが私の問題を解決するとは思いません。 –

答えて

0

データベースを避ける理由がある場合は、テストをスピードアップすることですが、より良い方法があります。

createの代わりにFactoryGirl.buildを可能な限り使用してください。これは、コードによってデータベースからレコードがフェッチされない限り機能します。これは、構造化されたコードを使った単体テストではうまくいきます。 (例えば、それはService Objectsを使用し、ユニットが独立してそれらをテストするのに役立ちます。実際には、あなたがFactoryGirl.createを使用して、トランザクションの備品を使用することができます)あなたのFoo.first例の呼び出しのように(データベースから読み取る必要がテストのために

。これが作成されますその後、データベースの各試験例の開始時にトランザクション、および例の最後にトランザクションをロールバックします。あなたは、このようなafter_commitとしてあなたのActiveRecordモデルでコールバックを使用する場合、この問題が発生する可能性があります。

あなたはafter_commitまたは他のコールバックを使用している場合データベーストランザクションを閉じる必要があるモデルでは(コード内で明示的なトランザクションを使用する)、DatabaseCleanerを設定することをお勧めします。 https://gist.github.com/RobinDaugherty/9f4e5f782d9fdbe191a23de30ad8b539

+0

はい、私のモチベーションはテストスイートを迅速に保つことです。 私はできるだけ 'FactoryGirl.build'と' FactoryGirl.build_stubbed'を使用していますが、データベースの依存関係を完全になくす方法を探していました。私はトランザクションの備品が私が望むものを達成するとは思わない。 これは私のところで早すぎる最適化のケースかもしれませんが、データベースのやりとりでテストを書く前に、それが不可能であることを確認したかっただけです。 –

+0

私は、 'FactoryGirl.build'からスタブを使うまでのスピードが大幅に増加するのではないかと疑います。しかし、モデル・ファクトリを使用すると、モデルの動作が正しいことが保証されるため、テストでは必ず品質が低下します。私はそれをお勧めしません。 –

関連する問題