Функция для создания фиктивных изображений в Django - PullRequest
0 голосов
/ 16 июня 2020

Я использую следующий код, найденный здесь, чтобы создать фиктивные изображения для тестов в Django.

def generate_test_image() -> ContentFile:
    """
    Generates simple test image.
    """
    image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0))
    file = BytesIO(image.tobytes())
    file.name = 'test.png'
    file.seek(0)
    django_friendly_file = ContentFile(file.read(), 'test.png')
    return django_friendly_file

Он работает нормально, и этот файловый объект, возвращаемый этой функцией, принимается ImageField и хранилищем бэкэнд без проблем во время тестов.

Недавно я решил добавить изображение ha sh на каждое изображение во время создания экземпляра модели. (он вызывается в каждом новом экземпляре save())

За это отвечает следующая функция:

def create_image_hash(image: BinaryIO, raise_errors: bool = False) -> Optional[imagehash.ImageHash]:
    """
    Creates image hash on image file.
    """
    try:
        image_hash = imagehash.average_hash(PIL.Image.open(image))
    except PIL.UnidentifiedImageError as err:
        if raise_errors:
            raise err from err
        return None
    return image_hash

как вы можете видеть, он использует PILLOW для открытия файла. Тип объекта для image аргумента, который эта функция получает во время не тестового обычного save, выдаваемого API: 'django.db.models.fields.files.ImageFieldFile'

И он также отлично работает, но не в тестах, потому что, очевидно, в тестах он будет получите ContentFile вместо ImageFieldFile, и ПОДУШКА сможет с этим справиться. (PIL.UnidentifiedImageError исключение)

Вопрос - можно ли создать файл фиктивного тестового изображения, который будет приниматься при сохранении экземпляра модели и одновременно приниматься PIL.Image.open(image) напрямую или, например, через прокси io.BytesIO? Я пробовал несколько вариантов, но безуспешно. Спасибо.

...