Estou testando GET
requisições básicas sob o requests
módulo. Estou usando requests.Session
para criar uma instância de sessão que é passada posteriormente para a função.
Estou zombando das chamadas de função. Eu corrigi a session.get
chamada dentro da função, mas recebo o seguinte erro:
AssertionError: chamada get('https://example-name/v1/0001') não encontrada
Imagino que não tenha corrigido o local corretamente, mas não tenho certeza de onde exatamente estou errando.
principal.py
import requests
base_url = "https://example-name/v1/"
session = requests.Session()
def fetch_data_with_session(session, base_url, endpoint):
response = session.get(base_url + endpoint)
return response.json()
teste_main.py
import unittest
from requests import Session
from main import fetch_data_with_session
from unittest.mock import Mock, patch
class TestingGet(unittest.TestCase):
@patch.object(Session, 'get')
def test_fetch(self, mock_get):
data = {
"id": "0001",
"name": "John Doe",
}
mock_response = Mock()
mock_response.json.return_value = data
mock_get.return_value = mock_response
mock_session = Mock()
retrieved_get_data = fetch_data_with_session(mock_session, "https://example-name/v1/", "0001")
mock_get.assert_any_call("https://example-name/v1/0001")
self.assertEqual = (outages_data, data)
if __name__ == '__main__':
unittest.main()
Também tentei usar o mock.get.assert_called_with
e obtive um erro semelhante.
assert_called_with
raise AssertionError(error_message)
AssertionError: expected call not found.
Expected: get('https://example-name/v1/0001')
Actual: not called.
Novamente, presumo que não estou corrigindo a chamada GET corretamente, mas não tenho certeza de como corrigir isso.
EDIT: Obrigado @Guy que forneceu a resposta. O código do módulo atualizado está abaixo. Por favor, veja a resposta de @Guy para a explicação
@patch.object(requests.Session, 'get')
def test_fetch(self, mock_get):
data = {
"id": "exampleID",
"name": "example",
"devices": [
{
"id": "0001",
"name": "Device A"
}
]
}
mock_response = Mock()
mock_response.json.return_value = data
mock_get.return_value = mock_response
outages_data = fetch_data_with_session(mock_get, "https://example-name/v1/", "0001")
mock_get.get.assert_called_with("https://example-name/v1/0001")
self.assertEqual = (outages_data, data)
Há dois problemas no seu código
Você usa
mock_session
para a chamada da API, mas testamock_get
para issomock_get
emock_session
são asession.get
função, nãoSession
a instânciaTeste simplificado com duas opções
e
main.py