2

fixture_file_upload在我的FactoryGirl方法中使用来测试文件上传。问题是清理数据库后,所有这些上传的文件都保留在Cloudinary.

我一直在使用Cloudinary::Api.delete_resourcesrake 任务来摆脱它们,但我宁愿在DatabaseCleaner删除所有相关的公共 ID 之前立即清理它们。

我应该DatabaseCleaner从哪里删除这些文件Cloudinary

4

3 回答 3

3

根据@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

我使用如下:在我的工厂女孩​​文件中,我拨打电话以在创建广告后立即添加任何 public_ids:

after(:build, :create) do 
  CleanupCloudinary.add_public_ids
end

在 env.rb 中,我添加了

at_exit do
  CleanupCloudinary.clean
end

以及在 spec_helper.rb

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

这导致,在测试期间,每 100 个云图像后进行清理,并在测试后清理剩余部分

于 2013-10-10T15:24:51.777 回答
1

我在这里有两种做事方式。

首先,除非是集成测试,否则我不会将任何内容上传到 cloudinary。我会使用模拟、存根或测试替身。

其次,如果你真的真的需要上传文件,我会写一个钩子,在after_all你的测试钩子中自动清理。

于 2013-10-06T14:22:49.307 回答
0

要使 @Danny 解决方案在 Minitest 中工作,而不是at_exitand config.after,请添加test_helper.rb

class ActiveSupport::TestCase
  ...
  Minitest.after_run do
    puts 'Cloudinary cleanup'
    CleanupCloudinary.clean
  end
end

如果您需要更频繁地清理,您可以teardown { CleanupCloudinary.clean }在全局test_helper.rb或特定测试文件中使用。

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

after(:create) do 
  CleanupCloudinary.add_public_ids
end
于 2020-08-23T12:22:23.033 回答