2

私は (遅ればせながら) RSpec/capybara を使用して Rails アプリ (ショッピング Web サイト) のテストを開始しました。データベース クリーナーを使用してデータベースをクリアし、Factory Girl を使用してすべてのテストで新しいオブジェクトを生成します (ほとんどの人が行うように)。これは問題なく動作し、テスト間でデータをクリアすることをお勧めします。

ただし、同じオブジェクトの複数のインスタンスを生成するのは遅くなる可能性があり、(私が知る限り) 少し面倒です。私のデータベースには常に同じオブジェクト、またはテスト用に常に同一のコピーを生成するオブジェクトがいくつかあります。たとえばPackage、サブスクリプション パッケージの価格設定と機能制限を定義するモデルです。それはおそらく決して変わらないでしょう。

この構成で (詳細情報が必要な場合はコメントして指定してください)、オブジェクトの特定のインスタンスをテスト データベースに配置してデータベース クリーナーから除外する方法、または特定のオブジェクトの永続的なコピーをテストデータベース?

これは主にテスト速度を上げるためです。

4

1 に答える 1

3

アプリケーションが決して変更しないデータベース オブジェクトがあり、それが運用データベースと開発データベース、およびテスト データベースで同じである場合、正しいことはそれらをシードにすることです。それらを db/seeds.rb に作成します。シードの詳細: http://guides.rubyonrails.org/active_record_migrations.html#migrations-and-seed-data

話しているオブジェクトがテスト データベースにのみ属している場合は、それらを Rails フィクスチャにすることができます。フィクスチャの詳細については、http: //guides.rubyonrails.org/testing.html#the-low-down-on-fixturesを参照してください (ただし、フィクスチャはテストを読みにくくするため、通常は悪い考えであることに注意してください。既存のフィクスチャの周りにテストを書くことをお勧めします.これは絡み合った混乱につながります.テストの明快さと堅牢性は速度よりも重要です.)

Database Cleaner の切り捨てまたは削除戦略を使用しており (おそらく Capybara で Javascript 対応のドライバーを使用しているため)、上記のいずれかの方法を使用してテスト間でテスト データベースにデータを残している場合は、次のことがわかります。特定のテーブルを空にしないためのデータベース クリーナー:

DatabaseCleaner.strategy = :truncation, {:only => %w[widgets dogs some_other_table]}

また

DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}

(ソース: https://github.com/bmabey/database_cleaner#how-to-use ) ただし、特定のクラスの一部のインスタンスを削除し、他のインスタンスを削除しないように Database Cleaner に指示する方法はわかりません。

于 2014-06-11T18:21:19.737 に答える