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


87

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

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

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

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

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

回答:


120

やり過ぎの解決策は次のようになります。

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

これをすべてレーキタスクで作成して実行できます。

ここからの別の解決策は、次のspec_helper.rbファイルを含めることです

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

免責事項:私はこれをテストしていません。すべての状況で機能するとは限らないため、SOの投稿を読む必要があります。

そうは言っても、このような状況を回避するために、データベースクリーナーgemを使用することをお勧めします。


1
最初の3つのrakedb:*は、すべてのテーブルを削除してスキーマから作成するため、最後の1つにのみ置き換えることができます。
konole 2014

2
Rails 5の場合ApplicationRecordActiveRecord::Base blog.bigbinary.com
Yo Ludke 2018年

3
rake db:structure:loadschema.rbの代わりにstructure.sqlを使用している場合に使用します。
Archonic 2018年

2
上記のRAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
すっきり

98

かもね:

bundle exec rake db:reset RAILS_ENV=test

20
私はまた実行することに気づきrake db:seed ます...これは問題であるかもしれないし、そうでないかもしれません
ハリーウッド

1
場合にはあなたがRailsの5を使用している、コマンドが今されてレールの代わりに熊手の:bundle exec rails db:reset RAILS_ENV=test
ウリエル・エルナンデス

15

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

rails db:environment:set RAILS_ENV=test

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

rails db:drop db:create db:migrate RAILS_ENV=test


2

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


0

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


0

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

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

うまくいけば、これは誰かを助けます。:)

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.