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>