ruby-on-rails - 在 RSpec 测试期间转储数据库
问题描述
我正在编写一个用于捕获片状测试的宝石。这个想法是转储数据库以定位随机工厂。我在 .after 挂钩中使用系统调用:
config.after do |example|
system "pg_dump -U postgres -d #{db_name} > #{path}/#{status}.sql"
end
此时数据库包含一条记录——我已经通过 byebug 确定了这一点。但是我遇到了一个问题 - 正如我所看到的,事务没有关闭,所以如果我尝试通过 psql 获取记录 - 我什么也没得到,记录不存在。任何想法如何在规范期间关闭交易?或者也许我在某个地方深深地错了?
解决方案
是的,问题是交易没有结束。数据库清理器将所有 rspec 执行包装在 begin-rollback 中。我找到了两种方法来解决我的问题:
- 使用活动记录连接转储数据库内容,但这并不容易 - 您必须使用 COPY 命令复制(意外,是吗?)所有表到文件(例如 .csv),然后恢复它们。额,乏味。
- 将数据库清理策略从 :transaction 更改为 :truncation:
config.before(:each, flaky: true) do
DatabaseCleaner.strategy = :truncation
end
这就是解决方案。
推荐阅读
- terraform - 无法为雪花连接构建 dsn:未提供身份验证方法
- c# - 对重复匹配使用单独的捕获组
- javascript - 为什么提交函数和ajax没有拾取模态中的html表单提交?
- java - 在 PHP 上运行 Java 的空数组
- android - 应用暂停时自动关闭 Flutter 模态底页
- vba - 循环计算和删除形状
- windows - 如何通过批处理计算一组文件夹中的所有子文件夹?(不是文件!)
- java - 不能在 Eclipse IDE for Enterprise Java and Web Developers 中运行非常简单的 Java 应用程序,但可以在 Eclipse IDE for Java Developers 中运行它
- snowflake-cloud-data-platform - 雪花处理问题
- flutter - 如何将颤动的应用栏徽标移动到左侧中心