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

时间:2014-09-16 20:19:57

标签: ruby-on-rails ruby rspec

我在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)

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

6 个答案:

答案 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手动执行。