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の新機能ですか?
Rails 4.1以降、rake db:test:*
タスクは廃止されました。代わりに、(test|spec)_helper.rb
には以下を含める必要があります。
ActiveRecord::Migration.maintain_test_schema!
これは、Rakeタスクから実行するかどうかにかかわらず、テストを実行するたびにテストデータベースが正しいスキーマを取得することを意味します。
rake test:prepare
が機能しているように見えますが、db:test:prepare
が現在何をしているのかわかりません。
ある人の答えをたどるだけで、この問題を解決するのに苦労することがあるので、より良い結果を得るためにカップルを一緒に投げました。ここに私がとるステップがありますが、どのステップが不要かはわかりませんが、最終的にはうまくいきます。
ActiveRecord::Migration.maintain_test_schema!
をtest_helper.rbファイルの先頭に追加します。rake test:prepare
rake db:migrate
rake db:migrate Rails_ENV=test
その後、bundle exec rake test
を実行すると、保留中の移行なしで毎回クリーンな結果が得られます。 (これは、最初にscaffoldを生成した直後に行うことです)。これらの手順のいずれかが絶対に必要ではないことがわかっている場合は、誰かが私を修正しても構いませんが、これが毎回動作することを確認する方法です。
試すこともできます
rake db:migrate Rails_ENV=test
として動作します
db:test:prepare
する:)
Rubyバージョンを管理するためにchruby
を使用しているときに、この問題があることがわかりました。 Railsは、システムコマンドを介してbin/Rails db:test:prepare
を呼び出します。これはchrubys $PATH
env varを利用しないため、システムRubyが何であれ実行され、通常ジェムが欠落しているために失敗します。残念ながら、私は現在、これに対する良い解決策を持っていません。
このように変数BEFOREコマンドを設定してみてください。このステートメントは私の問題を解決しました:
Rails_ENV=test rake db:migrate