Rails 4: How to reset test database?
我在Rails4上,注意到我的一些rspec测试失败了,因为我的一些测试重构使用了before过滤器(可能是因为事务)。这篇文章描述了一个类似的问题:
某些运行后未清除Rails测试数据库
除了使用databasecleaner gem,还有rake命令来清除测试数据库吗?我相信
1 | post :create, user: Fabricate.attributes_for(:user) |
坚持不懈。是否有其他重构方法来避免手动清除测试数据库?
过度杀伤的解决方案是:
1 2 3 | 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任务中完成这一切并运行它。
这里的另一个解决方案是包括下面的
1 2 3 | config.after :all do ActiveRecord::Base.subclasses.each(&:delete_all) end |
免责声明:我没有测试过这个,你应该阅读SO文章,因为它可能不适用于所有情况。
也就是说,我建议使用数据库清理器gem来避免这种情况。
它可以是:
1 | bundle exec rake db:reset RAILS_ENV=test |
有时可能需要运行此命令(可选)
但为了确保清除测试数据库,应该很容易做到:
您可以添加一个后过滤器,删除相关表中的所有条目。
最后,我编写了一个简单的rake任务,根据执行的命令,删除/迁移(或删除和迁移)所有测试和开发数据库。
它包括在发生错误时提示用户是否要继续的功能,并使用Open3的popen3方法(这样我们可以访问stdin、stdout和stderr;任何失败的命令不会导致rake任务的进程中止(与使用系统时不同)。
希望这能帮助别人。:)
https://github.com/xtrasimplicity/rake_all_db_助手/
编辑:但是,只要您想清除数据库,就需要从shell手动执行此操作。
从理论上讲,这个