在rspec / cucumber运行后清理cloudinary文件上传的位置

时间:2013-10-06 12:33:17

标签: ruby-on-rails rspec cucumber cloudinary

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

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

我应该在哪里干扰DatabaseCleanerCloudinary删除这些文件?

3 个答案:

答案 0 :(得分:2)

基于@ 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个云图像之后进行清理,并在测试之后清理剩余的图像

答案 1 :(得分:1)

我会在这里做两件事。

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

其次,如果你真的真的需要上传文件,无论出于何种原因,我会编写一个钩子,在你测试的after_all钩子中进行自动清理。

答案 2 :(得分:0)

要使@Danny解决方案在Minitest中工作,而不是at_exitconfig.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