为什么要求运行'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
做。
有时我在解决这个问题的时候遇到了麻烦,因为我只是跟着一个人的回答,所以为了得到更好的结果,我一起投了一对。 以下是我所采取的步骤,并不确定哪些是不必要的,但是最终是有效的。
- 添加
ActiveRecord::Migration.maintain_test_schema!
到test_helper.rb文件的顶部。 -
rake test:prepare
-
rake db:migrate
-
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。