Mock & Unit tests in Python: Ejemplos

 

Una vez que la introducción a esta librería de python ha sido explicada, profundizaré en las propiedades de mock en los unit tests programando en Python.

PARODIAR LO QUE UN MÉTODO DEVUELVE

Podría darse el caso en que necesitamos una serie de condiciones que son muy díficiles de darse en base de datos de tests unitarios, por lo que lo mejor es falsear lo que alguna función devuelve para evitar problemas en futuros tests o ejecuciones del mismo.

Para usar esta funcionalidad, tan sólo se necesita asignar la propiedad de return_value de un objeto mock con el valor que se desea.

Un ejemplo real de este test podría ser cuando necesitamos recuperar la lista de dispositivos para realizar ciertas operaciones con ellos.

@patch(“device_services.get_android_devices”)
def some_operation_with_devices_test(mock_android_devices):
    mock_android_devices.return_value = get_sample_android_devices()
    device_list = device_services.get_android_devices()
    ….
...

def get_sample_android_devices():
     return [DeviceObject(1), DeviceObject(2)]

En este caso, todo el código existente en get_android_devices será reemplazado por por el código del método get_sample_android_devices. De modo que, en vez de acceder a la base de datos para recuperar todos los dispositivos Android, sólo usamos en este aquellos definidos en get_sample_android_devices.

PARODIAR QUE UN MÉTODO HA SIDO LLAMADO

Es posible que necesites crear un tests en el que sólo te importa que un método ha sido llamado, te da igual lo demás.

¿Cuándo se querría realmento eso? Por ejemplo, cuando se necesitan enviar notificaciones a dispositivos. Sabemos que el método de enviar notificaciones funciona sin problemas (es sólo una llamada a un Web Service), pero no queremos que se envíen a esos dispositivos cada vez que los tests son lanzados. Imaginaros que uno de los dispositivos es un dispositivo personal, estaría harto su dueño.

Para probar esto, valdría con asegurar que la propiedad called es de tipo boolean y su valor es true.

Retomando el ejemplo de arriba, el siguiente bloque de código comprobaría que la interfaz de envío de notificaciones funcionaría para aquellos dispositivos Android.

@patch(“notification_service.send_gcm_notification”)
def test_send_android_notification(mock_android_notif):
    devices = device_service.get_list_of_android_devices()
    message = u“I am testing notifications”

    notification_service.send_notification(devices, message)

    assertTrue(mock_android_notif.called)

En este test, send_android_notifications de notifications_service ha sido alcanzado y llamado.

PARODIAR EFECTOS COLATERALES

Estos objetos falsos (mock) permiten lanzar efectos colaterales (una función que se lanza cuando sea que el objeto mock sea llamado) en vez de devolver simple valores. El efecto colateral más común es lanzar excepciones para asegurar que el código es lo suficientemente robusto en ese método ante posibles errores

La única cosa a tener en cuenta es que hay que asignar a la propiedad side_effect del objeto mock el deseado efecto (o método).

@patch(“upload_service.publish_file”)
def test_publish_file_error(mock_publish_file):
    mock_publish_file.side_effect = RuntimeError(“something bad happened during upload”)

    upload_path = get_sample_file_path()
    upload_service.upload_and_publish_file(upload_path)

    assertRaises(RuntimeError, upload_service.publish_file, upload_path)

    assertFalse(upload_service.is_file_into_system(upload_path))

    # other necessary assertions
    ….

Con el test anterior, se asegura que si algún error ocurre durante la actualización de la publicación de un fichero, éste se descarta y no se encuentra en nuestro sistema.

 

Deja un comentario

Responsable » Solidgear.
Finalidad » Gestionar los comentarios.
Legitimación » Tu consentimiento.
Destinatarios » Los datos que me facilitas estarán ubicados en los servidores SolidgearGroup dentro de la UE.
Derechos » Podrás ejercer tus derechos, entre otros, a acceder, rectificar, limitar y suprimir tus datos.

¿Necesitas una estimación?

Calcula ahora