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

在Rails 4.0.0.rc1,Ruby 2.0.0中,运行迁移之后,当我尝试通过rspec运行testing时,发现以下错误:

/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)

这看起来不正确。 没有人迁移他们的testing数据库,是吗? 他们db:test:prepare ,这是公平的 – 我忘记了。 所以我运行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! 

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

看起来像rake test:prepare工作,不知道什么db:test:prepare现在db:test:prepare做。

有时我在解决这个问题的时候遇到了麻烦,因为我只是跟着一个人的回答,所以为了得到更好的结果,我一起投了一对。 以下是我所采取的步骤,并不确定哪些是不必要的,但是最终是有效的。

  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我每次都得到干净的结果,没有挂起的迁移。 (这是我第一次生成脚手架后所做的)。 有人可以随时纠正我,如果你确定这些步骤中的一个是绝对没有必要的,但这是我如何确保它每次都有效。

你也可以试试

 rake db:migrate RAILS_ENV=test 

作为

 db:test:prepare 

确实:)

你可以尝试设置variablesBEFORE命令,就像这样。 这个声明解决了我的问题:

 RAILS_ENV=test rake db:migrate 

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