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

在运行迁移后,在Rails 4.0.0.rc1,Ruby 2.0.0上,尝试通过rake db:migrate RAILS_ENV=test运行测试时,看到以下错误:

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

那似乎不对。 没有人迁移他们的测试数据库,对吗? 他们是rake db:migrate RAILS_ENV=test,说实话,我已经忘记了。 因此,我运行rake db:test:prepare并再次运行rspec命令……并看到相同的错误。

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

这是怎么回事? 这是Rails 4中的新功能吗?

6个解决方案
68 votes

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

ActiveRecord::Migration.maintain_test_schema!

这意味着无论您是否通过Rake任务运行测试,每次运行测试数据库都将获得正确的架构。

Peeja answered 2019-11-08T10:37:45Z
29 votes

看起来rake test:prepare可以工作,不确定现在db:test:prepare会做什么。

Kris answered 2019-11-08T10:38:11Z
10 votes

当我只听一个人的回答时,有时仍然很难解决这个问题,所以我把一对夫妇扔在一起以获得更好的结果。 这是我采取的步骤,不确定哪些步骤不必要,但最终还是可以的。

  1. bundle exec rake test添加到test_helper.rb文件的顶部。
  2. bundle exec rake test
  3. bundle exec rake test
  4. bundle exec rake test

然后,当我运行bundle exec rake test时,每次都得到干净的结果,而没有挂起的迁移。 (这是我第一次生成支架后立即执行的操作)。 如果您确定绝对不需要这些步骤之一,则可以随时纠正我,但这是我确保每次都能使用的方式。

SilasOtoko answered 2019-11-08T10:39:00Z
9 votes

您也可以尝试

rake db:migrate RAILS_ENV=test

用作

db:test:prepare

做:)

meejoe answered 2019-11-08T10:39:38Z
2 votes

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

Jesse Brown answered 2019-11-08T10:40:05Z
0 votes

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

RAILS_ENV=test rake db:migrate
Unkas answered 2019-11-08T10:40:33Z
translate from https://stackoverflow.com:/questions/17150529/why-am-i-asked-to-run-rake-dbmigrate-rails-env-test