ChatGPT解决这个技术问题 Extra ChatGPT

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

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

是持久的,是否有另一种重构方式来避免手动清除测试数据库的需要?


C
Community

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

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 来避免这种情况。


前 3 个 rake db:* 只能用最后一个替换,因为它会删除所有表并从模式中创建它们。
对于 Rails 5,使用 ApplicationRecord 而不是 ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
如果您使用的是 structure.sql 而不是 schema.rb,请使用 rake db:structure:load
上面的一个更整洁的 1 班轮很简单:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
p
pjam

有可能:

(适用于 Rails Rails 5+)

bundle exec rails db:reset RAILS_ENV=test

对于以前的版本

bundle exec rake db:reset RAILS_ENV=test

我注意到它也运行 rake db:seed ...这可能是也可能不是问题
如果您使用的是 Rails 5,命令现在是 rails 而不是 rake:bundle exec rails db:reset RAILS_ENV=test
d
d1jhoni1b

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

rails db:environment:set RAILS_ENV=test

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

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


n
nbirla

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


t
tomr

从理论上讲,这个 ActiveRecord::Migration.maintain_test_schema! 应该可以解决问题。放入rails_helper.rb


X
XtraSimplicity

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

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

希望这可以帮助某人。 :)

https://github.com/xtrasimplicity/rake_all_db_helper/

编辑:但是,无论何时您想清除数据库,都需要从您的 shell 手动执行。


s
stevec

如果您想要seed the test database(在我的情况下不受欢迎),试试这个:

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

它将 1. 删除、2. 创建和 3. 迁移(但不是种子)测试数据库。