Mocking de una función en tests de Python

Recursos

Suponiendo que existe una función get_github_profile en services.py

import requests

def get_github_profile(user_id: int):
    """ Obtener datos de un usuario de Github """

    headers = {"accept": "application/vnd.github.v3+json"}

    response = requests.get(f"https://api.github.com/users/{user_id}", headers=headers)

    user = response.json()

    return user["name"]

Si hacemos un test que ejecute 100 veces esta función, encontraremos 2 problemas:

  • Las requests HTTP a una API externa son lentas.

  • Posiblemente alcancemos un límite de requests muy rápidamente.

En estos casos podemos mockear esa request a la API externa.

def test_get_github_profile(self):

    with patch('requests.get') as mock_request:

        # A partir de acá `requests.get` es nuestro mock y podemos
        # modificar su comportamiento como queramos

        # Set del valor que va a devolver nuestra request "fake"
        mock_request.return_value = {"user_id": 150, "name": "Katie"}

        result = get_github_profile(user_id=150)

        assert result == "Katie"