我在 Rails 4 上,注意到我的一些 RSpec 测试失败了,因为我的一些测试重构使用了 before 过滤器(可能是因为事务)。这篇文章描述了一个类似的问题:
rails test database not clearing after some runs
代替使用 DatabaseCleaner gem,是否有 rake 命令来清除测试数据库?我相信 rake db:test:prepare
在 Rails 4 中已被弃用。此外,如果在交易之前
`post :create, user: Fabricate.attributes_for(:user)`
是持久的,是否有另一种重构方式来避免手动清除测试数据库的需要?
一个矫枉过正的解决方案是:
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 来避免这种情况。
有可能:
(适用于 Rails Rails 5+)
bundle exec rails db:reset RAILS_ENV=test
对于以前的版本
bundle exec rake db:reset RAILS_ENV=test
rake db:seed
...这可能是也可能不是问题
bundle exec rails db:reset RAILS_ENV=test
有时您可能需要运行此命令(可选)
rails db:environment:set RAILS_ENV=test
但是确保清除您的测试数据库应该很简单:
rails db:drop db:create db:migrate RAILS_ENV=test
您可以添加一个后过滤器,从相关表中删除所有条目。
从理论上讲,这个 ActiveRecord::Migration.maintain_test_schema!
应该可以解决问题。放入rails_helper.rb
我最终编写了一个简单的 rake 任务,该任务根据执行的命令删除/迁移(或删除和迁移)所有测试和开发数据库。
它包括在发生错误时提示用户是否要继续的功能,并使用 Open3 的 popen3 方法(这样我们可以访问 stdin、stdout 和 stderr;并且任何失败的命令都不会导致 rake 任务的进程中止(与使用系统时不同))。
希望这可以帮助某人。 :)
https://github.com/xtrasimplicity/rake_all_db_helper/
编辑:但是,无论何时您想清除数据库,都需要从您的 shell 手动执行。
如果您不想要seed the test database(在我的情况下不受欢迎),试试这个:
bundle exec rails db:drop db:create db:migrate RAILS_ENV=test
它将 1. 删除、2. 创建和 3. 迁移(但不是种子)测试数据库。
不定期副业成功案例分享
ApplicationRecord
而不是ActiveRecord::Base
blog.bigbinary.com/2015/12/28/…rake db:structure:load
。RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load