Ruby on rails RSpec测试期间转储数据库

Ruby on rails RSpec测试期间转储数据库,ruby-on-rails,rspec,Ruby On Rails,Rspec,我在写一篇文章,是为了抓住不可靠的测试。其想法是转储数据库以定位随机工厂。我正在.after钩子中使用系统调用: config.after do |example| system "pg_dump -U postgres -d #{db_name} > #{path}/#{status}.sql" end 此时数据库包含一条记录——我已经用byebug确定了这一点。 然而,我遇到了一个问题——正如我所看到的,事务并没有关闭,所以如果我尝试通过psql获取记录——

我在写一篇文章,是为了抓住不可靠的测试。其想法是转储数据库以定位随机工厂。我正在.after钩子中使用系统调用:

config.after do |example|
   system "pg_dump -U postgres -d #{db_name} > #{path}/#{status}.sql"
end
此时数据库包含一条记录——我已经用byebug确定了这一点。 然而,我遇到了一个问题——正如我所看到的,事务并没有关闭,所以如果我尝试通过psql获取记录——我什么也得不到,记录不存在。
在spec期间如何关闭事务?或者我在某个地方大错特错了?

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

  • 使用活动记录连接转储数据库内容,但这并不容易-您必须使用COPY命令将所有表复制到文件(.csv)中,然后恢复它们。嗯,乏味
  • 将数据库清理器策略从:事务更改为:截断:

  • 这就是解决方案。

    请注意,对Databasecleaner的要求会使您的gem不那么受欢迎,对截断策略的要求也会降低。通过ActudieCordRD遍历所有现有表可能是更可持续的方法:/在RealssAdMug GEM中查看一下它是如何计算出所有现有的模型,这是一个合理的建议,我会考虑的,谢谢。
      config.before(:each, flaky: true) do
        DatabaseCleaner.strategy = :truncation
      end