在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中的新功能吗?
答案 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)
当我只是按照一个人的回答时,我仍然有时难以解决这个问题所以我已经把几个人扔在一起以获得更好的结果。以下是我采取的步骤,不确定哪些步骤是不必要的,但最终会有效。
ActiveRecord::Migration.maintain_test_schema!
添加到test_helper.rb文件的顶部。rake test:prepare
rake db:migrate
rake db:migrate RAILS_ENV=test
然后,当我运行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