Я использую следующий код, найденный здесь, чтобы создать фиктивные изображения для тестов в 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
? Я пробовал несколько вариантов, но безуспешно. Спасибо.