J'utilise pythons mock.patch et j'aimerais changer la valeur de retour pour chaque appel. Voici la mise en garde: la fonction à patcher n'a pas d'entrées, donc je ne peux pas changer la valeur de retour en fonction de l'entrée.
Voici mon code pour référence.
def get_boolean_response():
response = io.prompt('y/n').lower()
while response not in ('y', 'n', 'yes', 'no'):
io.echo('Not a valid input. Try again'])
response = io.prompt('y/n').lower()
return response in ('y', 'yes')
Mon code de test:
@mock.patch('io')
def test_get_boolean_response(self, mock_io):
#setup
mock_io.prompt.return_value = ['x','y']
result = operations.get_boolean_response()
#test
self.assertTrue(result)
self.assertEqual(mock_io.prompt.call_count, 2)
io.prompt
est juste une version indépendante de la plate-forme (python 2 et 3) de "input". Donc, en fin de compte, j'essaie de se moquer de l'entrée des utilisateurs. J'ai essayé d'utiliser une liste pour la valeur de retour, mais cela ne fonctionne pas.
Vous pouvez voir que si la valeur de retour est quelque chose d'invalide, je vais simplement obtenir une boucle infinie ici. J'ai donc besoin d'un moyen de modifier éventuellement la valeur de retour, de sorte que mon test se termine réellement.
(une autre façon possible de répondre à cette question pourrait être d'expliquer comment je pourrais imiter l'entrée d'utilisateur dans un test unitaire)
Pas un dup de cette question principalement car je n'ai pas la possibilité de faire varier les entrées.
L'un des commentaires de la réponse sur cette question va dans le même sens, mais aucune réponse / commentaire n'a été fourni.
is
pour comparer des chaînes littérales. Ne fais pas ça. Le fait que cela fonctionne (parfois) n'est qu'un détail d'implémentation dans CPython. Aussi, response is not 'y' or 'n' or 'yes' or 'no'
ne fait probablement pas ce que vous pensez que c'est ...
response is not 'y' or 'n' or 'yes' or 'no'
en ne faisant pas ce que vous pensez qu'il fait. Consultez Comment tester une variable par rapport à plusieurs valeurs? et vous ne devez pas utiliseris
pour comparer des valeurs de chaîne, utiliser==
pour comparer des valeurs , pas des identités d'objets.