【问题标题】:Why am I asked to run 'rake db:migrate RAILS_ENV=test'?为什么要求我运行“rake db:migrate RAILS_ENV=test”?
【发布时间】:2013-06-13 14:01:46
【问题描述】:

在 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:迁移 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 有效吗?
  • 对我来说 rake db:test:prepare 不起作用,即使 schema.rb 是最新的。只有迁移测试数据库有效。
  • 在这里查看我的答案,希望对您有所帮助:stackoverflow.com/a/33054787/4902373
  • rake db:migrate RAILS_ENV=test 为我解决了这个问题。
  • 我通过在 RSpec.configure 块之前添加 ActiveRecord::Migration.maintain_test_schema! 解决了这个问题 rails_helper.rb 文档:relishapp.com/rspec/rspec-rails/docs/…

标签: ruby-on-rails rails-migrations ruby-on-rails-4


【解决方案1】:

你可以尝试在命令之前设置变量,像这样。 这句话解决了我的问题:

RAILS_ENV=test rake db:migrate

【讨论】:

  • 这不能回答问题。问题是:为什么我们需要运行这个迁移,而不是如何修复错误。
  • 修改环境的顺序完全没有区别
【解决方案2】:

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

【讨论】:

  • 哇,你是怎么发现的?我也在使用chrubyActiveRecord::Migration.maintain_test_schema! 根本不适合我。你是怎么调试的?有什么修复吗?
【解决方案3】:

当我只遵循一个人的回答时,有时我仍然无法解决这个问题,所以我将几个放在一起以获得更好的结果。这是我采取的步骤,不确定哪些是不必要的,但它最终会起作用。

  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 时,我每次都会得到干净的结果,没有待处理的迁移。 (这是我第一次生成脚手架后所做的)。如果您确定绝对不需要其中一个步骤,请随时纠正我,但这是我确保它每次都能正常工作的方式。

【讨论】:

    【解决方案4】:

    从 Rails 4.1 开始,rake db:test:* 任务已被弃用。相反,您的 (test|spec)_helper.rb 应包括:

    ActiveRecord::Migration.maintain_test_schema!
    

    这意味着您的测试数据库每次运行测试时都会获得正确的架构,无论您是否从 Rake 任务运行它们。

    【讨论】:

    • 感谢那个,我想我在 4.1 发布时实际上错过了那个。
    • 这是正确的,对我来说是让您的测试数据库保持最新的最佳方式。错误是您有待运行的迁移。但是如果有人不想遵循这个很好的解决方法,我建议您删除测试数据库并重新运行rake db:create RAILS_ENV=test 以重新创建您的测试数据库,并运行rake db:migrate RAILS_ENV=test 只是为了迁移测试数据库。当我还没有为我的应用程序编写测试时,我经常这样做。
    • 我可以在 tests_helper.rb 在 rails 5 out of box 中看到这条线
    • 小心这个。如果您有多个测试数据库连接并且没有所有它们的迁移文件,ActiveRecord::Migration.maintain_test_schema!不会将开发模式加载到这些连接的测试模式中,您仍然需要手动加载它。
    • 顺便说一句,我无法让它与 Test::Unit 一起使用(例如在 test/test_helper.rb 中)
    【解决方案5】:

    你也可以试试

    rake db:migrate RAILS_ENV=test
    

    作为

    db:test:prepare
    

    确实:)

    【讨论】:

    • 实际上并没有。 rake db:migrate RAILS_ENV=test 将迁移测试数据库。 rake db:test:prepare 将(将)将模式加载到测试数据库中,这样更快且更不容易出错。
    【解决方案6】:

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

    【讨论】:

    • 哇。打在头上。谢谢! gist.github.com/Peeja/5831155 现在提交 Rails 错误...
    • 嗯。当我第一次发布时,我错过了test:prepare is 调用(取决于)db:test:prepare。不过,所有好事似乎都发生在db:test:prepare 之外。这是 Rails 代码:github.com/rails/rails/blob/…
    • 看起来数据库是从db:test:load 中的“schema.rb”创建的,test:preparedb:test:prepare 之后调用。但看起来db:test:load 也是直接从db:test:prepare 调用的。
    • 我在代码中看到了这一点,但我很确定(成功的)Rake::Task#invoke 出现在rake --trace 输出中,但我没有看到它实际发生。好奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多