ChatGPT解决这个技术问题 Extra ChatGPT

为什么要求我运行“rake db:migrate RAILS_ENV=test”?

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

P
Peeja

从 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 只是为了迁移测试数据库。当我还没有为我的应用程序编写测试时,我经常这样做。
我可以在 Rails 5 开箱即用的 tests_helper.rb 中看到这条线
小心这个。如果您有多个测试数据库连接并且没有所有它们的迁移文件,ActiveRecord::Migration.maintain_test_schema!不会将开发模式加载到这些连接的测试模式中,您仍然必须手动加载它。
顺便说一句,我无法让它与 Test::Unit 一起使用(例如在 test/test_helper.rb 中)
K
Kris

看起来 rake test:prepare 有效,但不确定 db:test:prepare 现在能做什么。


哇。打在头上。谢谢! gist.github.com/Peeja/5831155 现在提交 Rails 错误…
嗯。当我第一次发布时,我错过了 test:prepare 正在 调用(取决于)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 输出中,但我没有看到它实际发生。好奇的。
m
meejoe

你也可以试试

rake db:migrate RAILS_ENV=test

它作为

db:test:prepare

做:)


实际上并没有。 rake db:migrate RAILS_ENV=test 将迁移测试数据库。 rake db:test:prepare 将(将)将模式加载到测试数据库中,这样更快且不易出错。
S
SilasOtoko

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

添加 ActiveRecord::Migration.maintain_test_schema!到 test_helper.rb 文件的顶部。 rake test:prepare rake db:migrate rake db:migrate RAILS_ENV=test

然后,当我运行 bundle exec rake test 时,我每次都会得到干净的结果,没有待处理的迁移。 (这是我第一次生成脚手架后所做的)。如果您确定绝对不需要其中一个步骤,请随时纠正我,但这是我确保它每次都能正常工作的方式。


J
Jesse Brown

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


哇,你是怎么发现的?我也在使用 chruby,而 ActiveRecord::Migration.maintain_test_schema! 根本不适合我。你是怎么调试的?有什么修复吗?
U
Unkas

您可以尝试在命令之前设置变量,如下所示。这个声明解决了我的问题:

RAILS_ENV=test rake db:migrate

这不能回答问题。问题是:为什么我们需要运行这个迁移,而不是如何修复错误。
修改的环境的顺序绝对没有区别

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅