Je suis vraiment novice en matière de Python et de tests unitaires et j'essaie d'écrire des tests unitaires pour un gestionnaire en ce moment.
Une version simplifiée du gestionnaire ressemble à ceci :
some_handler.py
def handleEvent(event):
user = event....
action = event...
response = getIsAuthorized(user, action)
return convertToHttpResponse(response)
getIsAuthorized(user, action):
...
authorizer = SomeAuthorizer()
return authorizer.isAuthorized(user, action)
SomeAuthorizer est une classe simple :
some_authorizer.py
class SomeAuthorizer(object):
__init__(self):
# some instantiation of stuff needed for the 3P client
...
# creation of some 3P auth client
self.client = Some3PClient(...)
is_authorized(user, action):
return self.client.is_authorized(user, action)
Le code lui-même fonctionne comme prévu, mais mes tests me donnent du fil à retordre. J'ai réussi à le faire fonctionner dans certaines circonstances avec :
@patch.object(SomeAuthorizer, 'is_authorized')
def test_authorization_request_not_authorized(self, mock_is_authorized):
mock_is_authorized.return_value = False
response = handle_request(test_event("test_user", "testing"))
assert response == status_code(200, False)
Mais ensuite, lorsqu'un autre développeur a exécuté les tests sur sa machine, il a échoué et il semblait que la raison était qu'il n'avait pas configuré localement certains éléments d'environnement dont le constructeur de l'Authorizer avait besoin (les erreurs qu'ils ont obtenues localement étaient des problèmes de création d'une instance de SomeAuthorizer lorsque les tests étaient exécutés). Mais si j'ai bien compris, le constructeur ne devrait même pas être appelé parce qu'il est simulé ? Est-ce que ce n'est pas le cas ?
Des conseils sur la façon de contourner ce problème ? Je me frappe la tête contre le mur en essayant de comprendre comment les mocks fonctionnent et quelle combinaison de patch / mock fonctionnerait mais ça ne va pas loin.