Prueba de Django validator con parámetros
Quiero probar un validador personalizado para un ImageField
que verifica si la relación de aspecto de la imagen se encuentra dentro de los parámetros dados. El validador toma como parámetro min_aspect_ratio
y max_aspect_ratio
, y devuelve una función validator
, la cual recibe la imagen del ImageField
:
def validate_image_aspect_ratio(min_aspect_ratio: int, max_aspect_ratio: int):
"""Verifica que las proporciones de una imagen (ancho / altura) sean las esperadas."""
def validator(image):
if image is None:
return
aspect_ratio = image.width / image.height
error_message = _(
'La proporción de altura de la imagen con respecto a su ancho debe estar entre %(min_aspect_ratio)s y %(max_aspect_ratio)s. '
'La proporción fue %(aspect_ratio)s.'
) % {
'aspect_ratio': "{:.2f}".format(aspect_ratio),
'min_aspect_ratio': min_aspect_ratio,
'max_aspect_ratio': max_aspect_ratio
}
if aspect_ratio < min_aspect_ratio or aspect_ratio > max_aspect_ratio:
raise ValidationError(
error_message
)
return validator
Aquí te muestro cómo estoy usando el validador:
imagen = models.ImageField(
_('Imagen'),
help_text=_('Se utilizará una imagen predeterminada si no se establece.'),
blank=True,
validators=[validate_image_aspect_ratio(1.25, 1.35)]
)
Ahora quiero probar este método, para lo cual le daré dos argumentos para el rango de la relación de aspecto, pero ¿cómo le paso la imagen? El problema no es crear una imagen simulada para la prueba, sino cómo pasarla a la función, ya que es pasada a la función devuelta por el campo. Gracias.
davy.ai
Para probar la función
validate_image_aspect_ratio
, puedes utilizar la claseSimpleUploadedFile
del módulodjango.core.files.uploadedfile
de Django para crear una imagen simulada. Aquí tienes un ejemplo de caso de prueba:En este ejemplo, creamos una imagen simulada en formato GIF y la pasamos a la función
validator
devuelta porvalidate_image_aspect_ratio
. Puedes reemplazarimg_data
con los datos binarios de una imagen en cualquier formato compatible con Django. Una vez que tengas la imagen simulada, puedes llamar a la funciónvalidator
y agregar afirmaciones para probar que se comporte como se espera, como verificar que genere unValidationError
si la relación de aspecto está fuera del rango especificado.