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

Sol*_*tes 75 ruby rspec ruby-on-rails

我在Rails 4上并注意到我的一些RSpec测试失败了,因为我的一些测试重构使用了一个前置过滤器(可能是因为交易).这篇文章描述了类似的问题:

一些运行后,rails测试数据库没有清除

代替使用DatabaseCleaner gem,是否有rake命令来清除测试数据库?我相信rake db:test:prepare在Rails 4中已被弃用.另外,如果之前的交易喜欢

post :create, user: Fabricate.attributes_for(:user)
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*hol 107

一个矫枉过正的解决方案是:

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
Run Code Online (Sandbox Code Playgroud)

你可以在rake任务中完成这一切并运行它.

此处的另一个解决方案是包含以下spec_helper.rb文件

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end
Run Code Online (Sandbox Code Playgroud)

免责声明:我没有对此进行测试,您应该阅读SO帖子,因为它可能无法在所有情况下使用.

话虽这么说,我建议使用数据库清理器gem来避免这种情况.

  • 对于 Rails 5,使用 `ApplicationRecord` 而不是 `ActiveRecord::Base` https://blog.bigbinary.com/2015/12/28/application-record-in-rails-5.html (4认同)
  • 上述内容的更简洁的 1 行很简单:`RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load` (3认同)
  • 前 3 个 rake db:* 只能用最后一个替换,因为它删除所有表并从模式创建它们。 (2认同)
  • 如果您使用的是structure.sql而不是schema.rb,请使用`rake db:structure:load`。 (2认同)

mpz*_*mpz 83

有可能:

bundle exec rake db:reset RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

  • 我注意到还运行`rake db:seed` ...这可能是也可能不是问题 (18认同)
  • 如果您使用 Rails 5,命令现在是 **rails** 而不是 rake:`bundle exec rails db:reset RAILS_ENV=test` (2认同)

d1j*_*i1b 5

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

rails db:environment:set RAILS_ENV=test

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

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