Предотвращение остатков файлов изображений при тестировании моделей с ImageFields в Django 1.3 - PullRequest
2 голосов
/ 08 декабря 2011

Django 1.3 изменил поведение моделей с FileField s таким образом, что при удалении экземпляра фактические файлы остаются. Для большинства целей это нормально. Тем не менее, я тестирую приложение, которое интенсивно использует ImageField s, и у меня заканчиваются сотни бесполезных оставшихся изображений в моем каталоге загрузки для разработки. Поскольку это разработка, это не так уж и сложно, но я бы предпочел убирать за собой в тестах.

Какой лучший способ заставить эти изображения не зависать при тестировании . Я подчеркиваю эту часть, потому что я не хочу изменять это поведение по всем направлениям, используя переопределение delete и т. Д.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Я сломался и немного скомпрометировал.Я решил пойти дальше и использовать переопределенный 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 голос
/ 08 декабря 2011

A cron , которые вызывают команду django

0 голосов
/ 22 февраля 2013

У меня возникла проблема, и я нашел этот пост в 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*`")
...