Używam Pythona mock.patch i chciałbym zmienić wartość zwracaną dla każdego połączenia. Oto zastrzeżenie: łatana funkcja nie ma żadnych danych wejściowych, więc nie mogę zmienić wartości zwracanej na podstawie danych wejściowych.
Oto mój kod w celach informacyjnych.
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')
Mój kod testowy:
@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
jest po prostu niezależną od platformy (python 2 i 3) wersją "input". Ostatecznie więc staram się wyśmiewać dane wejściowe użytkowników. Próbowałem użyć listy dla wartości zwracanej, ale wydaje się, że to nie działa.
Możesz zobaczyć, że jeśli wartość zwracana jest czymś nieprawidłowym, po prostu otrzymam tutaj nieskończoną pętlę. Potrzebuję więc sposobu, aby ostatecznie zmienić wartość zwracaną, aby mój test faktycznie się zakończył.
(innym możliwym sposobem odpowiedzi na to pytanie może być wyjaśnienie, w jaki sposób mogę naśladować dane wejściowe użytkownika w teście jednostkowym)
Nie jest dupkiem w tym pytaniu, głównie dlatego, że nie mam możliwości zmiany danych wejściowych.
Jeden z komentarzy w odpowiedzi na to pytanie jest podobny, ale nie podano odpowiedzi / komentarza.
is
do porównania literałów ciągów. Nie rób tego. Fakt, że to działa (czasami) jest tylko szczegółem implementacji w CPythonie. Poza tym response is not 'y' or 'n' or 'yes' or 'no'
prawdopodobnie nie robi tego, co myślisz, że jest ...
response is not 'y' or 'n' or 'yes' or 'no'
w nie robić to, co myślisz, że to robi. Zobacz Jak przetestować jedną zmienną pod kątem wielu wartości? i należy nie używaćis
do porównania wartości ciągów, korzystanie==
porównać wartości , a nie tożsamości obiektów.