首页 > 解决方案 > 在 RSpec 测试期间转储数据库

问题描述

我正在编写一个用于捕获片状测试的宝石。这个想法是转储数据库以定位随机工厂。我在 .after 挂钩中使用系统调用:

config.after do |example|
   system "pg_dump -U postgres -d #{db_name} > #{path}/#{status}.sql"
end

此时数据库包含一条记录——我已经通过 byebug 确定了这一点。但是我遇到了一个问题 - 正如我所看到的,事务没有关闭,所以如果我尝试通过 psql 获取记录 - 我什么也没得到,记录不存在。任何想法如何在规范期间关闭交易?或者也许我在某个地方深深地错了?

标签: ruby-on-railsrspec

解决方案


是的,问题是交易没有结束。数据库清理器将所有 rspec 执行包装在 begin-rollback 中。我找到了两种方法来解决我的问题:

  1. 使用活动记录连接转储数据库内容,但这并不容易 - 您必须使用 COPY 命令复制(意外,是吗?)所有表到文件(例如 .csv),然后恢复它们。额,乏味。
  2. 将数据库清理策略从 :transaction 更改为 :truncation:
  config.before(:each, flaky: true) do
    DatabaseCleaner.strategy = :truncation
  end

这就是解决方案。


推荐阅读