es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar la función validate_image_aspect_ratio, puedes utilizar la clase SimpleUploadedFile del módulo django.core.files.uploadedfile de Django para crear una imagen simulada. Aquí tienes un ejemplo de caso de prueba:

    from django.core.files.uploadedfile import SimpleUploadedFile
    from django.test import TestCase
    
    from myapp.models import MyModel
    from myapp.validators import validate_image_aspect_ratio
    
    
    class MyModelTestCase(TestCase):
        def test_validate_image_aspect_ratio(self):
            validator = validate_image_aspect_ratio(1.25, 1.35)
            img_data = b'GIF87a\x02\x00\x02\x00\x80\x01\x00\x00\x00\x00ccc\xfe\xfe\xfe\x00\x00\x00!\xf9\x04\x01\n\x00\x01\x00,\x00\x00\x00\x00\x02\x00\x02\x00\x00\x02\x02L\x8a\x00;\x00'
    
            # Crea una imagen simulada usando SimpleUploadedFile
            image = SimpleUploadedFile("test.gif", img_data, content_type="image/gif")
    
            # Llama a la función del validador con la imagen simulada
            validator(image)
    
            # Si la imagen tiene una relación de aspecto dentro del rango especificado,
            # el validador no debería generar un ValidationError.
            # Agrega afirmaciones aquí para probar que el validador se comporta como se espera.
    

    En este ejemplo, creamos una imagen simulada en formato GIF y la pasamos a la función validator devuelta por validate_image_aspect_ratio. Puedes reemplazar img_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ón validator y agregar afirmaciones para probar que se comporte como se espera, como verificar que genere un ValidationError si la relación de aspecto está fuera del rango especificado.

Comments are closed.