Utilizar unittest.mock para monitorear llamadas
En este paso, exploraremos cómo utilizar el módulo unittest.mock
para monitorear las llamadas a funciones. El módulo unittest.mock
es una herramienta poderosa para pruebas y depuración, y proporciona una forma conveniente de realizar un seguimiento de las invocaciones de funciones, los argumentos y los valores de retorno.
Continuemos con la función greet
de los pasos anteriores. Utilizaremos unittest.mock
para monitorear las llamadas a greet
.
Modifica el archivo my_function.py
en el directorio ~/project
para incluir el siguiente código:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""This function greets the person passed in as a parameter."""
print(f"Hello, {name}!")
## Create a mock object for the greet function
mock_greet = mock.Mock(wraps=greet)
## Example usage
mock_greet("Alice")
mock_greet("Bob")
## Print the number of times the function was called
print(f"The greet function was called {mock_greet.call_count} times.")
## Print the arguments the function was called with
print(f"The calls were: {mock_greet.call_args_list}")
En este código:
- Importamos el módulo
mock
de unittest
.
- Creamos un objeto
mock.Mock
que envuelve la función greet
. El argumento wraps
le dice al objeto mock que llame a la función greet
original cuando se le llame.
- Luego llamamos al objeto
mock_greet
en lugar de la función greet
original.
- Finalmente, utilizamos los atributos
call_count
y call_args_list
del objeto mock para obtener información sobre las llamadas a la función.
Ejecuta el script nuevamente utilizando el mismo comando:
python ~/project/my_function.py
Deberías ver una salida similar a esta:
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
Esta salida muestra que la función greet
se llamó dos veces, y también muestra los argumentos que se le pasaron a la función en cada llamada.
Ahora, examinemos más de cerca la call_args_list
. Es una lista de objetos call
, cada uno de los cuales representa una única llamada a la función mockeada. Puedes acceder a los argumentos de cada llamada utilizando los atributos args
y kwargs
del objeto call
.
Por ejemplo, modifiquemos el código para imprimir los argumentos de la primera llamada:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""This function greets the person passed in as a parameter."""
print(f"Hello, {name}!")
## Create a mock object for the greet function
mock_greet = mock.Mock(wraps=greet)
## Example usage
mock_greet("Alice")
mock_greet("Bob")
## Print the number of times the function was called
print(f"The greet function was called {mock_greet.call_count} times.")
## Print the arguments the function was called with
print(f"The calls were: {mock_greet.call_args_list}")
## Print the arguments of the first call
if mock_greet.call_args_list:
print(f"The arguments of the first call were: {mock_greet.call_args_list[0].args}")
Ejecuta el script nuevamente:
python ~/project/my_function.py
Deberías ver una salida similar a esta:
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
The arguments of the first call were: ('Alice',)
Esta salida muestra que la primera llamada a greet
se hizo con el argumento "Alice"
.
El módulo unittest.mock
proporciona una forma poderosa y flexible de monitorear las llamadas a funciones en Python. Es una herramienta valiosa para pruebas, depuración y análisis de rendimiento.