我fixture_file_upload
在我的FactoryGirl
方法中使用来测试文件上传。问题是清理数据库后,所有这些上传的文件都保留在Cloudinary
.
我一直在使用Cloudinary::Api.delete_resources
rake 任务来摆脱它们,但我宁愿在DatabaseCleaner
删除所有相关的公共 ID 之前立即清理它们。
我应该DatabaseCleaner
从哪里删除这些文件Cloudinary
?
我fixture_file_upload
在我的FactoryGirl
方法中使用来测试文件上传。问题是清理数据库后,所有这些上传的文件都保留在Cloudinary
.
我一直在使用Cloudinary::Api.delete_resources
rake 任务来摆脱它们,但我宁愿在DatabaseCleaner
删除所有相关的公共 ID 之前立即清理它们。
我应该DatabaseCleaner
从哪里删除这些文件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
我使用如下:在我的工厂女孩文件中,我拨打电话以在创建广告后立即添加任何 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 个云图像后进行清理,并在测试后清理剩余部分
我在这里有两种做事方式。
首先,除非是集成测试,否则我不会将任何内容上传到 cloudinary。我会使用模拟、存根或测试替身。
其次,如果你真的真的需要上传文件,我会写一个钩子,在after_all
你的测试钩子中自动清理。
要使 @Danny 解决方案在 Minitest 中工作,而不是at_exit
and 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