Rails 4:如何重置测试数据库?

Posted

技术标签:

【中文标题】Rails 4:如何重置测试数据库?【英文标题】:Rails 4: How to reset test database? 【发布时间】:2014-11-10 17:34:11 【问题描述】:

我在 Rails 4 上并注意到我的一些 RSpec 测试失败了,因为我的一些测试重构使用了前置过滤器(可能是因为事务)。这篇文章描述了一个类似的问题:

rails test database not clearing after some runs

代替使用 DatabaseCleaner gem,是否有一个 rake 命令来清除测试数据库?我相信 rake db:test:prepare 在 Rails 4 中已被弃用。另外,如果在交易之前

`post :create, user: Fabricate.attributes_for(:user)`

是持久化的,有没有替代的重构方式来避免手动清除测试数据库的需要?

【问题讨论】:

【参考方案1】:

您可以添加一个后过滤器,从相关表中删除所有条目。

【讨论】:

【参考方案2】:

一个矫枉过正的解决方案是:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

您可以在 rake 任务中完成这一切并运行它。

here 的另一个解决方案是包含以下您的 spec_helper.rb 文件

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

免责声明:我没有对此进行测试,您应该阅读SO post,因为它可能不适用于所有情况。

话虽如此,我建议使用数据库清理器 gem 来避免这种情况。

【讨论】:

前 3 个 rake db:* 只能用最后一个替换,因为它会删除所有表并从模式中创建它们。 对于 Rails 5,使用 ApplicationRecord 而不是 ActiveRecord::Base blog.bigbinary.com/2015/12/28/… 如果您使用的是 structure.sql 而不是 schema.rb,请使用 rake db:structure:load 一个更整洁的 1 衬里就是:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load【参考方案3】:

可以是:

(适用于 Rails Rails 5+)

bundle exec rails db:reset RAILS_ENV=test

对于以前的版本

bundle exec rake db:reset RAILS_ENV=test

【讨论】:

我注意到它也运行rake db:seed ...这可能是也可能不是问题 如果您使用的是 Rails 5,命令现在是 rails 而不是 rake:bundle exec rails db:reset RAILS_ENV=test【参考方案4】:

理论上,这个ActiveRecord::Migration.maintain_test_schema! 应该可以解决问题。放入rails_helper.rb

【讨论】:

【参考方案5】:

我最终编写了一个简单的 rake 任务,根据执行的命令删除/迁移(或删除和迁移)所有测试和开发数据库。

它包括在发生错误时提示用户是否要继续的功能,并使用 Open3 的 popen3 方法(这样我们可以访问 stdin、stdout 和 stderr;并且任何失败的命令都不会导致rake 任务的进程中止(与使用 system 时不同))。

希望这对某人有所帮助。 :)

https://github.com/xtrasimplicity/rake_all_db_helper/

编辑:这将需要在您的 shell 中手动执行,但是,无论何时您想清除您的数据库。

【讨论】:

【参考方案6】:

有时您可能需要运行此命令(可选)

rails db:environment:set RAILS_ENV=test

但是确保清除您的测试数据库应该像这样简单:

rails db:drop db:create db:migrate RAILS_ENV=test

【讨论】:

以上是关于Rails 4:如何重置测试数据库?的主要内容,如果未能解决你的问题,请参考以下文章

每次测试单元功能后如何重置数据库?

如何在每次测试后重置 Django 测试数据库 ID?

Zend Framework 1 - 如何在功能集成测试中重置视图数据,而不是会话数据?

如何在 Rails 4 中测试控制器关注点

如何在不运行 rake spec 的情况下为 Rails rspec 测试准备测试数据库?

如何使用 MongoDB 和 Mongoid 在 Rails 3 上进行适当的数据库测试 (TDD)