J'ai ce problème régulièrement lorsque j'essaie de tester le code qui affiche des boîtes de dialogue pour la saisie par l'utilisateur, et la même solution devrait fonctionner pour les deux. Vous devez fournir une nouvelle fonction liée au nom input
dans votre étendue de test avec la même signature que la fonction standard input
qui renvoie juste une valeur de test sans réellement inviter l'utilisateur. Selon la façon dont vos tests et le code sont configurés cette injection peut se faire de plusieurs façons, donc je vais laisser cela comme un exercice pour le lecteur, mais votre méthode de remplacement sera quelque chose de simple comme:
def my_test_input(message):
return 7
Évidemment, vous pouvez également activer le contenu de message
si cela était pertinent et renvoyer le type de données de votre choix. Vous pouvez également faire quelque chose de plus souple et général qui permet de réutiliser la même méthode de remplacement dans un certain nombre de situations:
def my_test_input(retval, message):
return retval
et alors vous injecter une fonction partielle dans input
:
import functools
test_input_a = functools.partial(my_test_input, retval=7)
test_input_b = functools.partial(my_test_input, retval="Foo")
En quittant test_input_a
et test_input_b
en tant que fonctions prenant un seul argument message
, avec l'argument retval
déjà lié.
J'ai fini par faire quelque chose de similaire. J'ai créé une fonction test_input "test_input (msg)" qui remplacerait le comportement par défaut de l'entrée sur le module que je suis en train de tester: "module.input = test_input". Je définis la valeur d'entrée simulée avec une variable globale "sample_input" définie avant la fonction test_input et définie avant chaque test. – royvandewater