Rails 4:テストデータベースをリセットする方法
私はRails 4を使用していますが、テストリファクタリングの一部がbeforeフィルターを使用しているため(おそらくトランザクションのため)、RSpecテストの一部が失敗していることに気付きました。この投稿では、同様の問題について説明しています。
DatabaseCleaner gemを使用する代わりに、テストデータベースをクリアするrakeコマンドはありますか? rake db:test:prepare
はRails 4.で非推奨になったと思います。また、
post :create, user: Fabricate.attributes_for(:user)
永続的です。テストデータベースを手動でクリアする必要を回避するためのリファクタリングの代替方法はありますか?
過剰な解決策は次のとおりです。
bundle exec rake db:drop Rails_ENV=test
bundle exec rake db:create Rails_ENV=test
bundle exec rake db:schema:load Rails_ENV=test
これをすべてrakeタスクで作成して実行できます。
here の別の解決策は、次のspec_helper.rb
ファイルを含めることです
config.after :all do
ActiveRecord::Base.subclasses.each(&:delete_all)
end
免責事項:私はこれをテストしていません。すべての状況で機能しない可能性があるため、 SO post をお読みください。
そうは言っても、このような状況を避けるためにデータベースクリーナーgemを使用することをお勧めします。
かもね:
bundle exec rake db:reset Rails_ENV=test
このコマンドの実行が必要になる場合があります(オプション)
Rails db:environment:set Rails_ENV=test
ただし、テストデータベースを確実に消去するには、次のように簡単にする必要があります。
Rails db:drop db:create db:migrate Rails_ENV=test
関係するテーブルからすべてのエントリを削除する後フィルターを追加できます。
理論的には、このActiveRecord::Migration.maintain_test_schema!
でうまくいくはずです。 Rails_helper.rb
に入れてください
最終的に、実行されたコマンドに応じて、すべてのテストデータベースと開発データベースをドロップ/移行(またはドロップ&移行)する単純なrakeタスクを作成しました。
エラーが発生したときに続行するかどうかをユーザーに確認する機能が含まれ、Open3のpopen3メソッドを使用します(stdin、stdout、stderrにアクセスできます。失敗したコマンドはrakeタスクのプロセスになりません)中止(systemを使用する場合とは異なります)。
これが誰かの助けになることを願っています。 :)
https://github.com/xtrasimplicity/rake_all_db_helper/
編集:ただし、データベースをクリアする場合は、シェルから手動で実行する必要があります。