我在fixture_file_upload
方法中使用FactoryGirl
来测试文件上传。问题是清理数据库后,所有这些上传的文件都保留在Cloudinary
上。
我一直在使用Cloudinary::Api.delete_resources
使用rake任务来摆脱它们,但在DatabaseCleaner
删除所有相关的公共ID之前,我宁愿立即清理它们。
我应该在哪里干扰DatabaseCleaner
从Cloudinary
删除这些文件?
答案 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
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_exit
和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