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

Rails 4: How to reset test database?

我在Rails4上,注意到我的一些rspec测试失败了,因为我的一些测试重构使用了before过滤器(可能是因为事务)。这篇文章描述了一个类似的问题:

某些运行后未清除Rails测试数据库

除了使用databasecleaner gem,还有rake命令来清除测试数据库吗?我相信rake db:test:prepare在Rails 4中是不赞成的。此外,如果在交易前

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任务中完成这一切并运行它。

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

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


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

rails db:environment:set RAILS_ENV=test

但为了确保清除测试数据库,应该很容易做到:

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


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


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

它包括在发生错误时提示用户是否要继续的功能,并使用Open3的popen3方法(这样我们可以访问stdin、stdout和stderr;任何失败的命令不会导致rake任务的进程中止(与使用系统时不同)。

希望这能帮助别人。:)

https://github.com/xtrasimplicity/rake_all_db_助手/

编辑:但是,只要您想清除数据库,就需要从shell手动执行此操作。


从理论上讲,这个ActiveRecord::Migration.maintain_test_schema!应该会起作用。放在rails_helper.rb