在Django 1.3中使用ImageFields测试模型时防止剩余的图像文件

时间:2011-12-08 16:40:57

标签: django django-testing

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

在测试时,使这些图像不会挂在周围的最佳方法是什么?我强调这一部分是因为我不想全面修改这种行为,使用delete覆盖等。

3 个答案:

答案 0 :(得分:2)

我崩溃了并且妥协了一下。我决定继续使用被覆盖的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)

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

答案 1 :(得分:1)

致电django cron

command

答案 2 :(得分:0)

我遇到了这个问题,并在Google上发现了这个帖子。我更喜欢使用命令 - 所以这里有一些代码可能对其他人有用。这是在Django 1.4中,但应该适用于任何版本。我使用 WebTest

在基础测试课程中:

def get_test_image_input(self):
    return (
        '_test-image.jpg',
        file(os.path.join(settings.TEST_FILES_PATH, "images", "test.jpg")).read()
    )

在任何测试中:

form['image'] = self.get_test_image_input()

要在之后清理,我只需删除命令中以 _test-image 开头的所有文件:

from django.core.management.base import BaseCommand
from fabric.operations import local

class Command(BaseCommand):

    def handle(self, *args, **options):
        # test an app call "tests"
        local("python manage_test.py test tests -v 2")
        # could use call_command(...) instead

        # remove all test images
        local("sudo rm -rf `find . -name _test-image*`")