1

Rails アプリをテストするために、Cucumber を介して Capybara を使用しています。

Rails アプリには db/seeds.rb にいくつかのシード データがあり、承認ロールとデフォルトのユーザー アカウントを設定します。また、テスト データベースをシードしないrake db:test:prepareように、実行後にテスト データベースをシードするための test_seed.rake ファイルを追加しました。rake db:seedテストデータベース。

Capybara を使用して Cucumber 機能を実行すると、このシード データはそのまま残り、各機能のテストで行われた変更はロールバックされます。

ただし、AJAX ベースの機能をテストしようとすると、@javascriptテストの前に置いて Selenium が実行するようにすると、テストが完了するとシード データが消去されます。これはrake db:test:prepare、ユーザー アカウントの作成時に role_id を見つけることができないため、その後の承認ベースのテストは が再度実行されるまで失敗することを意味します。

セレンがこれを行うのはなぜですか? もっと言えば、どうすればそれを止めることができますか?

(Cucumber フックを使用して、各テストの前にデータをロードできることはわかっています。しかし、このデータは、RSpec ベースの単体テストの前にもロードする必要があります。また、開発データベースと運用データベースにもロードする必要があります。シード メカニズムのほうが DRY のようです. いずれにせよ、Selenium が呼び出されたからといって、データベースを別の方法でロールバックするべきではありません!)

編集::transaction戦略でdatabase_cleanerを使用しています。https://github.com/jnicklas/capybaraのドキュメントでは、database_cleaner について言及していますが、それを使用して:truncation、外部ブラウザーを呼び出すときに Capybara が行うのと同じように他のすべてを機能させるという行に沿ってのみ話しているようです。「奇妙な失敗」が好きではないので、そのページのパッチを試していません — よりクリーンな方法はありますか? テストを削除して、AJAX に目を向けるだけが、最も迅速で簡単な方法だと思い始めています…</p>

4

1 に答える 1

0

最終的に DatabaseCleaner.strategy を:truncationCucumber と RSpec の両方に変更し、データベースをシードするために SeedFu に移行しました。

Cucumber の場合、これを に追加しenv.rbます。

Before do
  SeedFu.quiet = true
  SeedFu.seed
end

(DatabaseCleaner.strategy を忘れずに変更してください!)

RSpec の場合、これを に追加しspec_helper.rbます。

config.before(:suite) do
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
  DatabaseCleaner.start
  SeedFu.quiet = true
  SeedFu.seed
end

config.after(:each) do
  DatabaseCleaner.clean
end

悲しいことに、これにより、すべてのテストの実行が少し遅くなります。以前は、データベースが毎回シードされるのではなく、1 回だけシードされてからロールバックされていたためです。シード ファイルにロールが 5 つしかない場合でも、それは顕著です。

于 2012-08-25T09:55:30.220 に答える