Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Mock basique
Tu testes un systeme de commande qui envoie un email de confirmation apres l'achat. Tu ne vas pas envoyer un vrai email a chaque test (tes clients recevraient des dizaines de spams par jour). C'est la qu'intervient le mock : un faux objet qui remplace le vrai.
Pense a un cascadeur au cinema. De l'exterieur, ca a l'air identique, mais c'est beaucoup plus sur et controlable. En testing, le mock te permet de verifier que ton code APPELLE bien la bonne fonction, avec les bons arguments, sans declencher d'effets reels.
En Python pur, le mock le plus simple est une fonction qui remplace une autre. Au lieu d'appeler la vraie fonction qui envoie un email, on appelle une fausse fonction qui enregistre juste qu'elle a ete appelee :
m = MockFunction()
m()
m()
m()
assert m.call_count() == 3, f'Le mock a ete appele 3 fois mais call_count renvoie {m.call_count()}'
Vérification des arguments
m = MockFunction()
m(1, 2, cle='valeur')
assert m.was_called_with(1, 2, cle='valeur'), 'Le mock devrait avoir ete appele avec ces arguments'
assert not m.was_called_with(3, 4), 'Le mock n a pas ete appele avec 3, 4'
Reset
m = MockFunction()
m()
m()
m.reset()
assert m.call_count() == 0, 'Apres reset, call_count devrait etre 0'
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
class MockFunction:
def __init__(self):
self.appels = []
self.valeur_retour = None
def set_return(self, value):
self.valeur_retour = value
def __call__(self, *args, **kwargs):
self.appels.append({"args": args, "kwargs": kwargs})
return self.valeur_retour
def call_count(self):
return len(self.appels)
def was_called_with(self, *args, **kwargs):
for appel in self.appels:
if appel["args"] == args and appel["kwargs"] == kwargs:
return True
return False
def reset(self):
self.appels = []