Ich habe dieses Problem regelmäßig, wenn ich versuche, Code zu testen, der Dialoge für Benutzereingaben aufruft, und die gleiche Lösung sollte für beide funktionieren. Sie müssen eine neue Funktion, die an den Namen input
in Ihrem Testbereich gebunden ist, mit derselben Signatur wie die Standardfunktion input
angeben, die nur einen Testwert zurückgibt, ohne den Benutzer tatsächlich dazu aufzufordern. Je nachdem, wie Tests und Code sind Setup diese Injektion kann auf verschiedene Weise geschehen, so werde ich, dass für den Leser als Übung verlassen, aber Ihre Ersatzmethode wird etwas Einfaches wie sein:
def my_test_input(message):
return 7
Natürlich könnten Sie auch den Inhalt von message
einschalten, wenn das relevant wäre, und natürlich den Datentyp Ihrer Wahl zurückgeben. Sie können auch etwas flexibler und allgemein tun, die für die Wiederverwendung der gleichen Austauschverfahren in einer Reihe von Situationen erlaubt:
def my_test_input(retval, message):
return retval
und dann würden Sie eine Teilfunktion in input
injizieren:
import functools
test_input_a = functools.partial(my_test_input, retval=7)
test_input_b = functools.partial(my_test_input, retval="Foo")
Weggehen test_input_a
und test_input_b
als Funktionen, die eine einzige message
Argument, mit dem retval
Argument bereits gebunden.
Ich habe etwas ähnliches getan. Ich habe eine test_input-Funktion "test_input (msg)" erstellt, die das Standardverhalten von Input auf dem getesteten Modul überschreiben würde: "module.input = test_input". Ich setze den simulierten Eingangswert mit einer globalen Variable "sample_input", die vor der test_input-Funktion definiert ist, und setze sie vor jedem Testfall. – royvandewater