web-dev-qa-db-ja.com

「rake db:migrate Rails_ENV = test」を実行するように求められるのはなぜですか?

Rails 4.0.0.rc1、Ruby 2.0.0で、移行を実行した後、rspecを介してテストを実行しようとすると、次のエラーが表示されます。

/Users/peeja/.rbenv/versions/2.0.0-p0/lib/Ruby/gems/2.0.0/gems/activerecord-4.0.0.rc1/lib/active_record/migration.rb:376:in `check_pending! ':移行は保留中です。この問題を解決するには、「rake db:migrate Rails_ENV = test」を実行します。 (ActiveRecord :: PendingMigrationError)

それは正しくないようです。テストデータベースを移行する人はいませんか?彼らはdb:test:prepare itであり、公正に言えば、私はそれを忘れていました。したがって、rake db:test:prepareを実行し、rspecコマンドを再度実行します…同じエラーが表示されます。

私が実際にrake db:migrate Rails_ENV=testなら、実際にはエラーは消えます。

どうしたの?これはRails 4の新機能ですか?

55
Peeja

Rails 4.1以降、rake db:test:*タスクは廃止されました。代わりに、(test|spec)_helper.rbには以下を含める必要があります。

ActiveRecord::Migration.maintain_test_schema!

これは、Rakeタスクから実行するかどうかにかかわらず、テストを実行するたびにテストデータベースが正しいスキーマを取得することを意味します。

67
Peeja

rake test:prepareが機能しているように見えますが、db:test:prepareが現在何をしているのかわかりません。

29
Kris

ある人の答えをたどるだけで、この問題を解決するのに苦労することがあるので、より良い結果を得るためにカップルを一緒に投げました。ここに私がとるステップがありますが、どのステップが不要かはわかりませんが、最終的にはうまくいきます。

  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を実行すると、保留中の移行なしで毎回クリーンな結果が得られます。 (これは、最初にscaffoldを生成した直後に行うことです)。これらの手順のいずれかが絶対に必要ではないことがわかっている場合は、誰かが私を修正しても構いませんが、これが毎回動作することを確認する方法です。

10
SilasOtoko

試すこともできます

rake db:migrate Rails_ENV=test

として動作します

db:test:prepare

する:)

9
meejoe

Rubyバージョンを管理するためにchrubyを使用しているときに、この問題があることがわかりました。 Railsは、システムコマンドを介してbin/Rails db:test:prepareを呼び出します。これはchrubys $PATH env varを利用しないため、システムRubyが何であれ実行され、通常ジェムが欠落しているために失敗します。残念ながら、私は現在、これに対する良い解決策を持っていません。

2
Jesse Brown

このように変数BEFOREコマンドを設定してみてください。このステートメントは私の問題を解決しました:

Rails_ENV=test rake db:migrate
0
Unkas