Sto usando pythons mock.patch e vorrei cambiare il valore di ritorno per ogni chiamata. Ecco l'avvertimento: la funzione da correggere non ha input, quindi non posso modificare il valore di ritorno in base all'input.
Ecco il mio codice per riferimento.
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')
Il mio codice di prova:
@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
è solo una versione indipendente dalla piattaforma (python 2 e 3) di "input". Quindi alla fine sto cercando di deridere l'input degli utenti. Ho provato a utilizzare un elenco per il valore restituito, ma ciò non sembra funzionare.
Puoi vedere che se il valore restituito è qualcosa di non valido, otterrò solo un ciclo infinito qui. Quindi ho bisogno di un modo per modificare eventualmente il valore di ritorno, in modo che il mio test finisca effettivamente.
(un altro modo possibile per rispondere a questa domanda potrebbe essere quello di spiegare come avrei potuto imitare l'input dell'utente in un test unitario)
Non è un problema di questa domanda principalmente perché non ho la possibilità di variare gli input.
Uno dei commenti della risposta a questa domanda è sulla stessa linea, ma non è stata fornita alcuna risposta / commento.
is
per confrontare i letterali delle stringhe. Non farlo. Il fatto che funzioni (a volte) è solo un dettaglio di implementazione in CPython. Inoltre, response is not 'y' or 'n' or 'yes' or 'no'
probabilmente non sta facendo quello che pensi che sia ...
response is not 'y' or 'n' or 'yes' or 'no'
nel non fare quello che pensi che faccia. Vedi Come testare una variabile con più valori? e si dovrebbe non usareis
per confrontare i valori di stringa, l'uso==
di confrontare i valori e non le identità degli oggetti.