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:如何重置测试数据库?的主要内容,如果未能解决你的问题,请参考以下文章
Zend Framework 1 - 如何在功能集成测试中重置视图数据,而不是会话数据?