Ruby on rails rspec/cucumber运行后在何处清理cloudinary文件上载

Ruby on rails rspec/cucumber运行后在何处清理cloudinary文件上载,ruby-on-rails,rspec,cucumber,cloudinary,Ruby On Rails,Rspec,Cucumber,Cloudinary,我在我的FactoryGirl方法中使用fixture\u file\u upload来测试文件上传。问题是,清理数据库后,所有上载的文件都保留在Cloudinary上 我一直在使用Cloudinary::Api.delete_资源使用rake任务来清除它们,但我宁愿在DatabaseCleaner删除所有相关的公共id之前立即清除它们 我应该在哪里干预DatabaseCleaner,以便从Cloudinary中删除这些文件?我在这里有两种方法 首先,我不会上传任何东西到cloudinary,除

我在我的
FactoryGirl
方法中使用
fixture\u file\u upload
来测试文件上传。问题是,清理数据库后,所有上载的文件都保留在
Cloudinary

我一直在使用
Cloudinary::Api.delete_资源
使用rake任务来清除它们,但我宁愿在
DatabaseCleaner
删除所有相关的公共id之前立即清除它们


我应该在哪里干预
DatabaseCleaner
,以便从
Cloudinary
中删除这些文件?

我在这里有两种方法

首先,我不会上传任何东西到cloudinary,除非它是一个集成测试。我会使用mock、stub或test-double


第二,如果你真的因为任何原因需要上传文件,我会在你的hook测试之后编写一个hook,在
中自动清理

首先,我不会上传任何东西到cloudinary,除非它是一个集成测试。我会使用mock、stub或test-double


第二,如果你真的因为任何原因需要上传文件,我会在你所有的钩子测试之后编写一个钩子,在一个
中进行自动清理。

基于@phoet的输入,并且考虑到cloudinary限制了你一天可以进行的API调用的数量,除了一次调用可以清理的图像数量之外,我还创建了一个类

class CleanupCloudinary
  @@public_ids = []

  def self.add_public_ids
    Attachinary::File.all.each do |image|
      @@public_ids << image.public_id

      clean if @@public_ids.count == 100
    end
  end

  def self.clean
    Cloudinary::Api.delete_resources(@@public_ids) if @@public_ids.count > 0

    @@public_ids = []
  end
end
在env.rb中,我添加了

at_exit do
  CleanupCloudinary.clean
end
以及在spec_helper.rb中

config.after(:suite) do
  CleanupCloudinary.clean
end

这导致在测试期间,在每100个cloudinary图像之后进行清理,并且在测试之后,根据@phoet的输入清理剩余的图像,并且考虑到cloudinary限制了您在一天内可以执行的API调用的数量,以及您可以在一次调用中清理的图像的数量,我创建了一个类

class CleanupCloudinary
  @@public_ids = []

  def self.add_public_ids
    Attachinary::File.all.each do |image|
      @@public_ids << image.public_id

      clean if @@public_ids.count == 100
    end
  end

  def self.clean
    Cloudinary::Api.delete_resources(@@public_ids) if @@public_ids.count > 0

    @@public_ids = []
  end
end
在env.rb中,我添加了

at_exit do
  CleanupCloudinary.clean
end
以及在spec_helper.rb中

config.after(:suite) do
  CleanupCloudinary.clean
end

这将导致在测试期间,在每100个cloudinary映像之后进行清理,并在测试之后清理剩余的

以使@Danny solution在Minitest中工作,而不是在退出时进行
配置。在
之后,添加
test\u helper.rb

class ActiveSupport::TestCase
...
Minitest.after_运行do
“云清理”
干净的,干净的
结束
结束
如果需要更频繁地清理,可以在
test\u helper.rb
或特定测试文件中全局使用
teardown{CleanupCloudinary.clean}

当然,在工厂里,你仍然需要:

(:create)do之后的

CleanupCloudinary.add_public_id
结束

要使@Danny solution在Minitest中工作,请在
后添加
test\u helper.rb
,而不是退出时的
配置:

class ActiveSupport::TestCase
...
Minitest.after_运行do
“云清理”
干净的,干净的
结束
结束
如果需要更频繁地清理,可以在
test\u helper.rb
或特定测试文件中全局使用
teardown{CleanupCloudinary.clean}

当然,在工厂里,你仍然需要:

(:create)do之后的

CleanupCloudinary.add_public_id
结束

我将attachinary gem与cloudinary结合使用,但还没有找到在我的模型中保留“has_attachment”指令的方法。是否存在在所有测试运行之后运行的“after_all”(在所有测试运行之后运行)?只需对每个测试文件执行此操作,不会产生任何差异。这取决于:
config.after(:each){your_hook}
是100%干燥的。您还可以使用标记来标记必须运行的spec。使用rspec有无数种方法可以做到这一点。我正在使用attachinary gem,与cloudinary结合使用,但还没有找到一种方法在我的模型中绕过“has_attachment”指令。是否存在在所有测试运行之后运行的“after_all”(在所有测试运行之后运行)?只需对每个测试文件执行此操作,不会产生任何差异。这取决于:
config.after(:each){your_hook}
是100%干燥的。您还可以使用标记来标记必须运行的spec。使用rspec有无数种方法可以做到这一点。
:build
选项在(:build,:create)do
之后的
中无效,因为它显然不在数据库中写入。否则,要使其在Minitest中工作,请通过在
test\u helper.rb
中添加
teardown{CleanupCloudinary.clean}
来替换退出时的
config.after
。在(:build,:create)do
之后的
中,
:build
选项无效,因为它显然不会写入数据库。否则,要使其在Minitest中工作,请通过在
test\u helper.rb
中添加
teardown{CleanupCloudinary.clean}
来替换退出处的
config.after