2017-10-09 4 views
1

J'ai une classe que j'essaie de couvrir avec des tests en python.Mocking en mode Python: comment modifier le comportement en fonction des valeurs d'entrée?

J'ai une dépendance qui est injectée dans la classe. Je ne me soucie pas vraiment des internes de la dépendance ici, et je veux me moquer de lui.

J'instancier la classe dans mes tests, l'injection de la dépendance:

dependency = MagicMock() 
dependency.some_func = MagicMock(return_value='blue') 
under_test = UnderTest(dependency) 

Plus tard, quand je veux tester la classe UnderTest, je veux la dépendance pour retourner une valeur différente en fonction de quels paramètres ont été passés à il. Ainsi, dans le code sous test, je pourrais avoir quelque chose comme

value = dependency.some_func('a') 

mais je veux aussi la dépendance de revenir à autre chose lorsqu'elle est appelée avec une valeur différente.

value = dependency.some_func('b') 

Idéalement (et je l'ai vu dans d'autres cadres), je serais en mesure de configurer la maquette pour renvoyer des valeurs différentes, par exemple (comment je voudrais que cela fonctionne)

dependency.some_func = MagicMock([ 
    {'called_with': 'a', 'return_value': 'blue'}, 
    {'called_with': 'b', 'return_value': 'green'} 
]) 

Répondre

1

Vous pouvez utiliser l'attribut side_effect pour définir un appel qui renvoie différentes valeurs en fonction de ses arguments.

results = {'a': 'blue', 'b': 'green'} 
dependency.some_func = MagicMock(side_effect=lambda arg: results.get(arg, DEFAULT)) 

(Le DEFAULT singleton est utilisé pour indiquer que la valeur normale de retour simulé est utilisé pour les arguments non dans le dict.)

+0

parfait. Merci beaucoup –