web-dev-qa-db-ja.com

Rails 4:テストデータベースをリセットする方法

私はRails 4を使用していますが、テストリファクタリングの一部がbeforeフィルターを使用しているため(おそらくトランザクションのため)、RSpecテストの一部が失敗していることに気付きました。この投稿では、同様の問題について説明しています。

いくつかの実行後にレールテストデータベースがクリアされない

DatabaseCleaner gemを使用する代わりに、テストデータベースをクリアするrakeコマンドはありますか? rake db:test:prepareはRails 4.で非推奨になったと思います。また、

post :create, user: Fabricate.attributes_for(:user)

永続的です。テストデータベースを手動でクリアする必要を回避するためのリファクタリングの代替方法はありますか?

73

過剰な解決策は次のとおりです。

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を使用することをお勧めします。

103
ChrisBarthol

かもね:

bundle exec rake db:reset Rails_ENV=test
79
mpz

このコマンドの実行が必要になる場合があります(オプション)

Rails db:environment:set Rails_ENV=test

ただし、テストデータベースを確実に消去するには、次のように簡単にする必要があります。

Rails db:drop db:create db:migrate Rails_ENV=test

5
d1jhoni1b

関係するテーブルからすべてのエントリを削除する後フィルターを追加できます。

2
nbirla

理論的には、このActiveRecord::Migration.maintain_test_schema!でうまくいくはずです。 Rails_helper.rbに入れてください

0
tomr

最終的に、実行されたコマンドに応じて、すべてのテストデータベースと開発データベースをドロップ/移行(またはドロップ&移行)する単純なrakeタスクを作成しました。

エラーが発生したときに続行するかどうかをユーザーに確認する機能が含まれ、Open3のpopen3メソッドを使用します(stdin、stdout、stderrにアクセスできます。失敗したコマンドはrakeタスクのプロセスになりません)中止(systemを使用する場合とは異なります)。

これが誰かの助けになることを願っています。 :)

https://github.com/xtrasimplicity/rake_all_db_helper/

編集:ただし、データベースをクリアする場合は、シェルから手動で実行する必要があります。

0
XtraSimplicity