django - 在 Django 1.3 中使用 ImageFields 测试模型时防止残留图像文件

标签 django django-testing

Django 1.3 更改了具有 FileField 的模型的行为,以便在删除实例时保留实际文件。对于大多数用途来说,这很好。但是,我正在测试一个大量使用 ImageField 的应用程序,最终我的开发上传目录中出现了数百个无用的剩余图像。由于它是开发中的,所以这不是什么大问题,但我更愿意在测试后自行清理。

测试时让这些图像不徘徊的最佳方法是什么?。我强调这一部分是因为我不想使用 delete 覆盖等全面修改此行为。

最佳答案

我崩溃了并妥协了一点。我决定继续使用覆盖的 delete,但我根据传递 include_images=True kwarg 来删除实际的图像文件。

class Photo(models.Model):
    ...
    def delete(self, *args, **kwargs):
        if kwargs.pop('include_images', False):
            for field in self._meta.fields:
                if type(field) == models.ImageField:
                    image = self.__getattribute__(field.name)
                    if image.name != '':
                        image.storage.delete(image.name)
        super(Photo, self).delete(*args, **kwargs)

然后,我修改了测试用例中的 tearDown 方法,如下所示:

def tearDown(self):
    for p in Photo.objects.all():
        p.delete(include_images=True)

我对这个解决方案并不完全满意,但它是我能达到的最接近我认为理想的解决方案。这实际上应该全部由测试本身来处理。

关于django - 在 Django 1.3 中使用 ImageFields 测试模型时防止残留图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434422/

相关文章:

django - 使用多个遗留数据库测试 django 应用程序

python - 如何使用 pytest 测试 Django 模型?

django - 如何在 values_list 查询中使用 Django GenericRelation

Django 静态数据,最佳实践文件系统

python - 如何在 Django 的查询集中传递两个以上的参数?

python - 如何过滤元组中的第二个元素?

python - pytest-django:这是用参数测试 View 的正确方法吗?

django 测试 - 确认模型是唯一的,具体取决于另一个字段

django - 工厂男孩 : define field that depends on other field

python - 如何删除 Django 中的 X 框架选项 header ?