Python mocking rohe Eingabe in Unittests
Nehme an, dass ich dieses python-code:
def answer():
ans = raw_input('enter yes or no')
if ans == 'yes':
print 'you entered yes'
if ans == 'no':
print 'you entered no'
Wie Schreibe ich einen unittest für diese ? Ich weiß, dass ich mit 'Mock', aber ich verstehe nicht, wie. Kann das jemand machen einige einfache Beispiel ?
Kommentar zu dem Problem - Öffnen
mögliche Duplikate von supply Eingänge zu python unittests
Ich kann dort keine Antwort finden
Eine der drei Antworten ist buchstäblich über die mit
verspotten
test raw_input
InformationsquelleAutor der Frage user3156971 | 2014-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht, patch-input, sondern Sie können wickeln Sie es verwenden, zu spotten.patch(). Hier ist eine Lösung:
Beachten Sie, dass dieses snippet funktioniert nur in Python-Versionen 3.3+
InformationsquelleAutor der Antwort gawel
Okay, zunächst, ich denke, es ist notwendig zu betonen, dass in den original-code in Frage, es gibt tatsächlich zwei Dinge, die angegangen werden müssen:
raw_input
(ein Eingang Nebenwirkung) muss verspottet werden.print
(ein Ausgang Nebenwirkung) muss überprüft werden.In eine ideale Funktion für unit-Tests, gäbe es keine Nebenwirkungen. Eine Funktion würde einfach getestet werden, indem er in den Argumenten und Ihrer Ausgabe würde überprüft werden. Aber oft wollen wir für den test von Funktionen, die nicht ideal sind, DH, in der Funktionen wie Ihnen.
Also, was sollen wir tun? Naja, in Python 3.3, die beide die Probleme, die ich oben aufgeführt wurde trivial, weil die
unittest
Moduls die Fähigkeit erworben, zu verspotten und zu überprüfen für Nebenwirkungen. Aber, wie der start ins neue Jahr 2014, nur 30% der Python-Programmierer hatte, verschoben auf 3.x, so dass für das wohl der anderen 70% der Python-Programmierer immer noch mit 2.x werde ich skizzieren, eine Antwort. Bei der aktuellen rate, 3.x nicht überholen 2.x bis ~2019, und 2.x wird nicht verschwinden, bis ~2027. Also ich finde diese Antwort nützlich sein wird für mehrere Jahre zu kommen.Möchte ich zu den Fragen oben aufgeführt, ein zu einer Zeit, also werde ich zunächst ändern Sie Ihre Funktion mit
print
als Ausgabe zu verwendenreturn
. Keine überraschungen, hier ist das code:Also alles, was wir tun müssen, ist mock
raw_input
. Einfach genug - Omid Raha Antwort auf diese Frage zeigt uns, wie zu tun, dass durch swizzling aus der__builtins__.raw_input
Umsetzung mit unseren mock-Implementierung. Außer seine Antwort war nicht richtig organisiert in einemTestCase
und Funktionen, so werde ich zeigen, dass.Kleine Anmerkung nur auf Python-Namenskonventionen - Variablen, die erforderlich sind, durch den parser aber nicht verwendet werden, sind in der Regel benannt
_
, wie im Fall der lambda-nicht verwendete variable (die normalerweise von der Eingabeaufforderung angezeigt, um den Benutzer im Fall derraw_input
, incase Sie sich Fragen, warum es überhaupt erfordert, in diesem Fall).Sowieso, das ist unübersichtlich und redundant. Ich werde also tun, Weg mit der Wiederholung, indem man eine
contextmanager
, die es erlauben, für einfachewith
Aussagen.Denke ich, gut beantwortet den ersten Teil von diesem. Zu dem zweiten Teil - Prüfung
print
. Ich fand das viel schwieriger - ich würde gerne hören, wenn jemand eine bessere Antwort.Sowieso, die
print
- Anweisung kann nicht überschrieben werden, aber wenn Sieprint()
Funktionen statt (wie Sie sollte) und diefrom __future__ import print_function
können Sie die folgenden verwenden:Das knifflige bit ist hier, dass Sie brauchen, um
yield
eine Antwort, bevor diewith
- block eingegeben wird. Aber Sie können nicht wissen, was die Antwort sein wird, bis dieprint()
innerhalb derwith
- block aufgerufen wird. Dies wäre in Ordnung, wenn Saiten wurden verändert, aber Sie sind nicht. Anstatt also ein kleines Versprechen oder proxy-Klasse aus -PromiseString
. Es macht nur zwei Dinge - lassen Sie eine Zeichenfolge (oder so was) eingestellt werden und lassen Sie uns wissen, wenn es gleich einer anderen Zeichenfolge. EinPromiseString
istyield
ed und legen Sie dann den Wert, der normalerweiseprint
innerhalb derwith
block.Hoffentlich schätzen Sie alle diese Tricks, die ich geschrieben habe, da dauerte es rund 90 Minuten, um gemeinsam an diesem Abend. Getestet habe ich alle von diesem Kodex und überprüft alles funktioniert mit Python 2.7.
InformationsquelleAutor der Antwort ArtOfWarfare
Rannte über das gleiche problem, aber ich verspottet Sie heraus
__builtin__.raw_input
.Nur getestet, auf Python 2.
pip install mock
wenn Sie nicht bereits über das Paket installiert.Alternativ dazu können Sie die Bibliothek genty, können Sie zur Vereinfachung die beiden tests:
InformationsquelleAutor der Antwort Jeff-Meadows
Ich bin mit Python 3.4 und anpassen musste Antworten. Meine Lösung Faktoren die gemeinsamen code in die custom -
runTest
Methode und zeigt, wie Sie patch-beideinput()
undprint()
. Hier ist code, der ausgeführt wird:import unittest
von io import StringIO
von unittest.mock-import-patch
InformationsquelleAutor der Antwort tbc0
InformationsquelleAutor der Antwort Omid Raha
Einfach nur posten, was ich brauchte, mit python 3.6.3
Die input-Funktion wurde verwendet, die mehrfach in einer einzigen Funktion, die ich hatte zu prüfen, so dass eine änderung der return nicht funktioniert.
Ich musste auch die Verwendung der verschiedenen Eingänge jedes mal, wenn es verwendet wurde.
Hier ist eine kurze demo zeigt zwei Methoden auf, wie Sie diese erreichen
InformationsquelleAutor der Antwort BustahBoi