为什么我要求运行'rake db:migrate RAILS_ENV = test'?

时间:2013-06-17 14:52:06

标签: ruby-on-rails rails-migrations ruby-on-rails-4

在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,这是公平的 - 我忘记了。所以我运行rake db:test:prepare并再次运行rspec命令...并看到相同的错误。

如果我实际上是rake db:migrate RAILS_ENV=test,那么错误确实会消失。

发生了什么事?这是Rails 4中的新功能吗?

6 个答案:

答案 0 :(得分:65)

从Rails 4.1开始,不推荐rake db:test:*个任务。相反,您的(test|spec)_helper.rb应该包含:

ActiveRecord::Migration.maintain_test_schema!

这意味着每次测试运行时,测试数据库都会获得正确的模式,无论您是否从Rake任务运行它们。

答案 1 :(得分:28)

看起来rake test:prepare有效,不确定db:test:prepare现在做了什么。

答案 2 :(得分:10)

当我只是按照一个人的回答时,我仍然有时难以解决这个问题所以我已经把几个人扔在一起以获得更好的结果。以下是我采取的步骤,不确定哪些步骤是不必要的,但最终会有效。

  1. ActiveRecord::Migration.maintain_test_schema!添加到test_helper.rb文件的顶部。
  2. rake test:prepare
  3. rake db:migrate
  4. rake db:migrate RAILS_ENV=test
  5. 然后,当我运行bundle exec rake test时,每次都会得到干净的结果,没有待定的迁移。 (这是我第一次生成脚手架后我做的事情)。如果您确定其中一个步骤绝对没有必要,有人可以随意纠正我,但这就是我确保它每次都有效的方法。

答案 3 :(得分:8)

您也可以尝试

rake db:migrate RAILS_ENV=test

用作

db:test:prepare

的作用:)

答案 4 :(得分:2)

我发现使用chruby来管理我的ruby版本时遇到了这个问题。 Rails通过系统命令调用bin/rails db:test:prepare。这没有利用chrubys $PATH env var,因此它可以像系统ruby一样运行,并且因为通常缺少gem而失败。不幸的是,我目前没有一个很好的解决方案。

答案 5 :(得分:1)

你可以尝试设置变量BEFORE命令,就像这样。 这句话解决了我的问题:

RAILS_ENV=test rake db:migrate