Comment puis-je simuler une entrée sur stdin pour pyunit?
Je suis en train de tester une fonction qui prend en entrée de stdin
que je suis en train de tester avec quelque chose comme ceci:
cat /usr/share/dict/words | ./spellchecker.py
Dans le nom de l'automatisation des tests, est-il possible que pyunit
peut simuler la saisie de raw_input()
?
source d'informationauteur bejar37
Vous devez vous connecter pour publier un commentaire.
La réponse courte est de monkey patch
raw_input()
.Il y a quelques bons exemples dans la réponse à la Comment afficher la redirection de l'entrée standard stdin en Python?
Ici est un simple exemple trivial à l'aide d'un
lambda
qui jette l'invite et renvoie ce que nous voulons.Système Sous Test
Cas de Test:
Mise à jour -- à l'aide de unittest.se moquer.patch
Depuis python 3.3, il y a du nouveau sous-module pour
unittest
appelé fantaisie qui fait exactement ce que vous devez faire. Pour ceux qui utilisent la version 2.6 de python ou au-dessus, un backport demock
trouvé ici.Réponse précédente -- remplacement de sys.stdin
Je pense que le module sys peut-être ce que vous cherchez.
Vous pouvez faire quelque chose comme
raw_input va maintenant lire à partir de simulatedInput.txt chaque fois qu'il est appelé. Si le contenu de simulatedInput était
puis le premier appel à raw_input serait de retour "bonjour", le second "bob" et la troisième serait de jeter un EOFError comme il n'y avait pas plus de texte à lire.
Remplacer
sys.stdin
avec une instance deStringIO
et de charger laStringIO
exemple, avec les données que vous voulez en retour viasys.stdin
. Aussi,sys.__stdin__
contient l'originalsys.stdin
objet, donc la restaurationsys.stdin
après votre test est aussi simple quesys.stdin = sys.__stdin__
.Fudge est un grand python se moquer de module, avec des décorateurs pour faire des correctifs comme ça, pour vous, avec nettoyage automatique. Vous devriez vérifier.
Vous n'avez pas de décrire ce genre de code est dans
spellchecker.py
ce qui me donne la liberté de spéculer.Suppose que c'est quelque chose comme ceci:
Pour améliorer la testabilité de
check_stdin
fonction, je propose de refactoriser le code comme ceci:Aujourd'hui, la plupart de votre logique est en
check
fonction, et vous pouvez à la main artisanat quelle que soit l'entrée que vous pouvez l'imaginer, afin de le tester correctement, sans avoir à traiter avecstdin
.Mes 2 cents.
Si vous utilisez maquette du module (écrit par Michael Foord), afin de se moquer raw_input fonction, vous pouvez utiliser une syntaxe du type: