Mise à jour
Mise à jour de la base de données, veuillez patienter...
Site original : Sam & Max: Python, Django, Git et du cul
Dans le guide sur les tests en python (que je dois toujours terminer, je sais…), je vous parle des objets mocks.
Si vous avez eu le plaisir de jouer avec asyncio
, vous avez du noter que unittest.mock
n’a aucun outil pour gérer gérer les coroutines.
En attendant que ce soit intégré à la stdlib, voici une petite recette :
import asyncio from unittest.mock import Mock # on utilise toute la machinerie du Mock original class AMock(Mock): def __call__(self, *args, **kwargs): # sauf qu'à l'appel on créé une fonction coroutine @asyncio.coroutine def coro(): # Qui fait le vrai Mock.__call__ (et donc popule l'historique # des appels), mais seulement après l'évent loop l'ait éxécuté super(AMock, self).__call__(*args, **kwargs) # On appelle la fonction coroutine pour générer une coroutine # (les coroutines marchent comme les générateurs) return coro() |
Je propose qu’en l’honneur de ce bidouillage, on l’appelle… mockoroutine !
Ca va s’utiliser comme ça:
mockorourine = AMock() yield from mockorourine() |
Après le yield from
, mockorourine.call_count == 1
, et mockorourine.assert_called_once_with()
passe.
Si vous êtes en 3.5+, on peut même faire:
class AMock(Mock): def __call__(self, *args, **kwargs): async def coro(): super(AMock, self).__call__(*args, **kwargs) return coro() def __await__(self): # on delegue le await à la couroutine créée par __call__ return self().__await__() |
Puis:
await AMock() |