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

Pee*_*eja 58 ruby-on-rails rails-migrations ruby-on-rails-4

在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中的新功能吗?

Pee*_*eja 69

从Rails 4.1开始,rake db:test:*不推荐使用任务.相反,你(test|spec)_helper.rb应该包括:

ActiveRecord::Migration.maintain_test_schema!
Run Code Online (Sandbox Code Playgroud)

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

  • 这是正确的,是我及时了解测试数据库的最佳方式.错误是_您有待迁移到run_.但是如果有人不想遵循这个伟大的解决方法,我建议你删除测试数据库并重新运行`rake db:create RAILS_ENV = test`来重新创建测试数据库,并运行`rake db:migrate RAILS_ENV = test`只是为了迁移测试数据库.当我还没有为我的应用程序编写测试时,我经常这样做. (2认同)

Kri*_*ris 29

看起来像rake test:prepare作品,不知道db:test:prepare现在做什么.


Sil*_*oko 10

当我只是按照一个人的答案时,我仍然有时难以解决这个问题所以我已经把几个人扔在一起以获得更好的结果.以下是我采取的步骤,不确定哪些步骤是不必要的,但它最终会起作用.

  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时,每次都会得到干净的结果,没有待定的迁移.(这是我第一次生成脚手架后我做的事情).如果您确定其中一个步骤绝对没有必要,有人可以随意纠正我,但这就是我确保它每次都有效的方法.


小智 9

你也可以试试

rake db:migrate RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

作为

db:test:prepare
Run Code Online (Sandbox Code Playgroud)

确实:)

  • 实际上,它没有.`rake db:migrate RAILS_ENV = test`将迁移测试数据库.`rake db:test:prepare`将(将)加载到测试数据库中,这样更快,更不容易出错. (8认同)