2013-06-17 31 views
41

、Rubyの2.0.0、私は、マイグレーションを実行した後、私はrspecを通じてテストを実行しようとすると、私は次のエラーを参照してください。なぜrake db:migrate RAILS_ENV = testを実行するのですか? Railsの4.0.0.rc1で

/Users/peeja/.rbenv/バージョン2.0.0-p0/lib/ruby​​/gems/2.0.0/gems/activerecord-4.0.0.rc1/lib/active_record/migration.rb:376: `check_pending! ':移行は保留中です。この問題を解決するには 'rake db:migrate RAILS_ENV = test'を実行してください。 (ActiveRecord :: PendingMigrationError)

これは正しくないようです。テストデータベースを移行する人はいませんか?彼らはdb:test:prepareそれは公平だと私は忘れてしまった。だからrake db:test:prepareを実行して、私のrspecコマンドをやり直してください...そして同じエラーが表示されます。

実際にrake db:migrate RAILS_ENV=testとした場合、エラーは実際には消えません。

何が起こっているのですか?これはRails 4の新機能ですか?

+0

'rake db:test:prepare'は動作しますか? – itsnikolay

+2

'schema.rb'が最新であっても' rake db:test:prepare'は動作しません。テストデータベースの移行のみが機能します。 – Kris

+0

ここで私の答えをチェックアウトしてください、それが助けてくれることを望みます:http://stackoverflow.com/a/33054787/4902373 –

答えて

53

をRailsの4.1の時点では、rake db:test:*タスクは推奨されません。代わりに、あなたの(test|spec)_helper.rbが含まれている必要があります

ActiveRecord::Migration.maintain_test_schema! 

これは、あなたのテスト用データベースを使用すると、rakeタスクからそれらを実行するかどうか、正しいスキーマをあなたのテストを実行するたびに取得することを意味します。

+0

その1つをありがとう、私は実際には4.1がリリースされたときにそれを見逃してしまった。 – jipiboily

+1

これは正しいですし、あなたのテストデータベースを最新の状態に保つための最良の方法です。このエラーは、実行待ちの移行が保留中であることです。しかし、誰かがこの素晴らしい回避策に従わない場合は、テストデータベースを削除し、 'rake db:create RAILS_ENV = test'を実行してテストデータベースを再作成し、' rake db:migrate RAILS_ENV = test 'を実行してテストデータベースを移行します。私は、私のアプリケーションのテストをまだ書いていないときにこれを頻繁に行います。 –

+1

この行は、レールの 'tests_helper.rb'にあります。 – Abhilash

23

rake test:prepareのように見えますが、わからないのはdb:test:prepareになりました。あなたはまた、

db:test:prepare 

として働く

rake db:migrate RAILS_ENV=test 

を試すことができます

+0

うわー。それを頭で打つ。ありがとう! https://gist.github.com/Peeja/5831155これでRailsのバグをファイルに... – Peeja

+1

Huh。私が最初に投稿したとき、私は 'test:prepare' *が' db:test:prepare'を呼び出していることに気づきませんでした。良いものはすべて 'db:test:prepare'の外で発生するようです。ここにRailsのコードがあります:https://github.com/rails/rails/blob/067e1505d4e054df566e065f4faf11ee4b430a3d/activerecord/lib/active_record/railties/databases.rake#L399 – Peeja

+0

データベースが 'schema.rb 'から' 'db:test:prepare'の後に' test:prepare'が呼び出すdb:test:load'を返します。しかし 'db:test:load'は' db:test:prepare'から直接呼び出されます。 – Kris

5

はありません:)

+5

それは実際にはありません。 'rake db:migrate RAILS_ENV = test'は、テストデータベースを移行します。 'rake db:test:prepare'はスキーマをテスト・データベースにロードします(テスト・データベースにはエラーが発生しにくくなります)。 – Peeja

9

私はまだ一人の答えに従うときにこの問題を分類するのに時々問題があるので、より良い結果を得るために一緒にカップルを投げました。ここでは、私が取るステップは、どのものが不必要であるかわからないが、それは最後に動作します。

  1. ActiveRecord::Migration.maintain_test_schema!をtest_helper.rbファイルの先頭に追加します。
  2. rake test:prepare
  3. rake db:migrate
  4. rake db:migrate RAILS_ENV=test

私はbundle exec rake testを実行したときそれから私は、保留中の移行できれいな結果を毎回取得します。 (これは最初に足場を生成した直後のことです)。あなたがこれらのステップの1つが絶対に必要でないことを確実に知っているなら誰かが私を修正することを自由に感じますが、これはどのように毎回動作するかを確認する方法です。

1

chrubyを使って自分のルビーバージョンを管理すると、この問題が発生しています。 Railsはシステムコマンドでbin/rails db:test:prepareを呼び出します。これはchrubys $PATHのenv varを利用していないので、システムのルビーと同じように実行され、通常は宝石が欠落しているため失敗します。残念ながら、私は現在このための良い解決策を持っていません。

+1

うわー、どうやって見つけましたか?私も 'chruby'を使っていますし、' ActiveRecord :: Migration.maintain_test_schema! 'は単に私にとってはうまくいきません。どのようにデバッグしましたか?すべての修正? –

2

このように、変数BEFOREコマンドを設定できます。 この文は私の問題を解決しました:

RAILS_ENV=test rake db:migrate 
+2

これは質問に答えません。問題は、なぜエラーを修正するかではなく、この移行を実行する必要があるかどうかです。 – Ievgen

関連する問題