Ich verwende pythons mock.patch und möchte den Rückgabewert für jeden Aufruf ändern. Hier ist die Einschränkung: Die zu patchende Funktion hat keine Eingaben, daher kann ich den Rückgabewert nicht basierend auf der Eingabe ändern.
Hier ist mein Code als Referenz.
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')
Mein Testcode:
@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
ist nur eine plattformunabhängige (Python 2 und 3) Version von "input". Letztendlich versuche ich also, die Benutzereingaben zu verspotten. Ich habe versucht, eine Liste für den Rückgabewert zu verwenden, aber das funktioniert nicht.
Sie können sehen, dass ich hier nur eine Endlosschleife bekomme, wenn der Rückgabewert etwas Ungültiges ist. Ich brauche also eine Möglichkeit, den Rückgabewert zu ändern, damit mein Test tatsächlich beendet wird.
(Eine andere Möglichkeit, diese Frage zu beantworten, könnte darin bestehen, zu erklären, wie ich Benutzereingaben in einem Komponententest nachahmen kann.)
Kein Problem mit dieser Frage, vor allem, weil ich nicht in der Lage bin, die Eingaben zu variieren.
Einer der Kommentare der Antwort auf diese Frage ist in die gleiche Richtung, es wurde jedoch keine Antwort / kein Kommentar abgegeben.
is
String-Literale zu vergleichen. Tu das nicht. Die Tatsache, dass es (manchmal) funktioniert, ist nur ein Implementierungsdetail in CPython. Auch response is not 'y' or 'n' or 'yes' or 'no'
tut wahrscheinlich nicht, was Sie denken, dass es ist ...
response is not 'y' or 'n' or 'yes' or 'no'
in nicht zu tun , was Sie denken , es tut. Siehe Wie teste ich eine Variable gegen mehrere Werte? und Sie sollten nicht verwendenis
, um Zeichenfolgenwerte zu vergleichen, verwenden==
, um Werte zu vergleichen , nicht Objektidentitäten.