Café y Código

7. Mocks y patch

¿Por qué mockear?

En una prueba unitaria querés controlar el entorno: sin red, sin base de datos real y sin tiempos aleatorios. unittest.mock ofrece objetos falsos y registros de llamadas.

Mock y MagicMock

mock básico
PYTHON
1 from unittest.mock import Mock
2
3 api = Mock()
4 api.fetch.return_value = {"ok": True}
5 assert api.fetch("/users")["ok"] is True
6 api.fetch.assert_called_once()

patch: reemplazar donde se usa

unittest.mock.patch reemplaza un nombre en el módulo bajo prueba. La regla de oro: parcheá el camino donde se busca el símbolo al importar/usar, no solo donde está definido el original.

inyectar un Mock como dependencia
PYTHON
1 from unittest.mock import Mock
2
3 def calcular_total(fetch):
4 data = fetch()
5 return sum(data)
6
7 def test_total_con_mock():
8 fetch_mock = Mock(return_value=[10, 20])
9 assert calcular_total(fetch_mock) == 30
10 fetch_mock.assert_called_once()

Ejercicio 1

Creá un Mock() llamado logger y hacé que logger.info("hola") pueda llamarse; luego assert logger.info.called.

Ver solución propuesta
PYTHON
1 from unittest.mock import Mock
2
3 def test_logger_llamado():
4 logger = Mock()
5 logger.info("hola")
6 assert logger.info.called

Ejercicio 2

¿Por qué mockear una API HTTP en un unit test en lugar de pegarle a la red real?

Ver idea guía

Velocidad, determinismo (sin fallos por red) y no depender de servicios externos para validar tu lógica.

Ponte a prueba

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.