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


87

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

运行后无法清除Rails测试数据库

代替使用DatabaseCleaner gem,是否存在rake命令来清除测试数据库?我相信rake db:test:prepareRails 4不推荐使用。此外,如果在进行类似交易之前

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

是持久的。是否有另一种重构方法来避免需要手动清除测试数据库?

Answers:


120

过度杀伤的解决方案是:

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任务中完成所有任务并运行它。

这里的另一种解决方案是包括以下spec_helper.rb文件

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

免责声明:我尚未对此进行测试,因此您应该阅读SO帖子,因为它可能无法在所有情况下都起作用。

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


1
前3个rake db:*只能替换为最后一个rake db:*,因为它删除所有表并从架构中创建它们。
konole 2014年

2
为Rails 5,使用ApplicationRecord替代ActiveRecord::Base blog.bigbinary.com/2015/12/28/...
哟Ludke

3
使用rake db:structure:load,如果你使用的structure.sql代替schema.rb。
Archonic

2
上面的更整洁的1衬纸很简单:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667

98

有可能:

bundle exec rake db:reset RAILS_ENV=test

20
我注意到它也可以运行rake db:seed ...可能有问题也可能没有问题
哈里·伍德

1
如果您使用的是Rails 5,那么命令现在是rails而不是rake:bundle exec rails db:reset RAILS_ENV=test
UrielHernández'18

15

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

rails db:environment:set RAILS_ENV=test

但是确保清除测试数据库应该很简单:

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


2

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


0

从理论上讲,这ActiveRecord::Migration.maintain_test_schema!应该可以解决问题。放进去rails_helper.rb


0

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

它包括一些功能,可在出现错误时提示用户是否愿意继续操作,并使用Open3的popen3方法(这样我们就可以访问stdin,stdout和stderr;并且任何失败的命令都不会导致rake任务的执行中止(与使用system不同)。

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

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

编辑:但是,每当您要清除数据库时,都需要从Shell手动执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.