在 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 中的新功能吗?
rake db:test:prepare
有效吗?
schema.rb
是最新的,rake db:test:prepare
也不起作用。只有迁移测试数据库有效。
rake db:migrate RAILS_ENV=test
为我解决了这个问题。
rails_helper.rb
文档中的 RSpec.configure
块之前添加 ActiveRecord::Migration.maintain_test_schema!
来解决此问题:relishapp.com/rspec/rspec-rails/docs/…
从 Rails 4.1 开始,不推荐使用 rake db:test:*
任务。相反,您的 (test|spec)_helper.rb
应包括:
ActiveRecord::Migration.maintain_test_schema!
这意味着您的测试数据库将在每次运行测试时获得正确的模式,无论您是否从 Rake 任务运行它们。
看起来 rake test:prepare
有效,但不确定 db:test:prepare
现在能做什么。
test:prepare
正在 调用(取决于)db:test:prepare
。不过,所有好事似乎都发生在 db:test:prepare
之外。这是 Rails 代码:github.com/rails/rails/blob/…
db:test:load
中的“schema.rb”创建的,test:prepare
在 db:test:prepare
之后调用。但看起来 db:test:load
也是直接从 db:test:prepare
调用的。
Rake::Task#invoke
出现在 rake --trace
输出中,但我没有看到它实际发生。好奇的。
你也可以试试
rake db:migrate RAILS_ENV=test
它作为
db:test:prepare
做:)
rake db:migrate RAILS_ENV=test
将迁移测试数据库。 rake 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
时,我每次都会得到干净的结果,没有待处理的迁移。 (这是我第一次生成脚手架后所做的)。如果您确定绝对不需要其中一个步骤,请随时纠正我,但这是我确保它每次都能正常工作的方式。
我发现在使用 chruby
管理我的 ruby 版本时遇到了这个问题。 Rails 通过系统命令调用 bin/rails db:test:prepare
。这没有利用 chrubys $PATH
env var,因此无论系统 ruby 是什么,它都会运行,并且通常会因为缺少 gem 而失败。不幸的是,我目前对此没有很好的解决方案。
chruby
,而 ActiveRecord::Migration.maintain_test_schema!
根本不适合我。你是怎么调试的?有什么修复吗?
您可以尝试在命令之前设置变量,如下所示。这个声明解决了我的问题:
RAILS_ENV=test rake db:migrate
rake db:create RAILS_ENV=test
以重新创建您的测试数据库,而运行rake db:migrate RAILS_ENV=test
只是为了迁移测试数据库。当我还没有为我的应用程序编写测试时,我经常这样做。tests_helper.rb
中看到这条线Test::Unit
一起使用(例如在test/test_helper.rb
中)