我在Rails 4上并注意到我的一些RSpec测试失败了,因为我的一些测试重构使用了一个前置过滤器(可能是因为交易)。这篇文章描述了一个类似的问题:
rails test database not clearing after some runs
代替使用DatabaseCleaner gem,是否有rake命令来清除测试数据库?我相信在Rails 4中不推荐使用rake db:test:prepare
。此外,如果在事务之前如
post :create, user: Fabricate.attributes_for(:user)
是持久的。是否有另一种重构方法可以避免手动清除测试数据库?
答案 0 :(得分:103)
过度杀伤解决方案将是:
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来避免这种情况。
答案 1 :(得分:75)
可以是:
bundle exec rake db:reset RAILS_ENV=test
答案 2 :(得分:5)
有时您可能需要运行此命令(可选)
rails db:environment:set RAILS_ENV=test
但是确保清除您的测试数据库应该很简单:
rails db:drop db:create db:migrate RAILS_ENV=test
答案 3 :(得分:1)
您可以添加后过滤器,删除相关表格中的所有条目。
答案 4 :(得分:0)
理论上这个ActiveRecord::Migration.maintain_test_schema!
应该可以解决问题。把它放在rails_helper.rb
答案 5 :(得分:0)
我最终编写了一个简单的rake任务,根据执行的命令,删除/迁移(或删除和迁移)所有测试和开发数据库。
它包括提示用户在发生错误时是否要继续的功能,并使用Open3的popen3方法(这样我们就可以访问stdin,stdout和stderr;并且任何失败的命令都不会导致rake任务的进程中止(与使用 system 时不同))。
希望这有助于某人。 :)
https://github.com/xtrasimplicity/rake_all_db_helper/
编辑:无论何时您想要清除数据库,都需要从shell手动执行。