Estoy usando pythons mock.patch y me gustaría cambiar el valor de retorno para cada llamada. Aquí está la advertencia: la función que se está parcheando no tiene entradas, por lo que no puedo cambiar el valor de retorno en función de la entrada.
Aquí está mi código de referencia.
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')
Mi código de prueba:
@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
es solo una versión independiente de plataforma (python 2 y 3) de "input". Así que, en última instancia, estoy tratando de burlarme de la entrada de los usuarios. He intentado usar una lista para el valor de retorno, pero eso no parece funcionar.
Puede ver que si el valor de retorno es algo no válido, obtendré un bucle infinito aquí. Entonces, necesito una forma de cambiar eventualmente el valor de retorno, para que mi prueba realmente finalice.
(Otra posible forma de responder a esta pregunta podría ser explicar cómo podría imitar la entrada del usuario en una prueba unitaria)
No es un duplicado de esta pregunta principalmente porque no tengo la capacidad de variar las entradas.
Uno de los comentarios de la respuesta a esta pregunta es similar, pero no se ha proporcionado respuesta / comentario.
is
para comparar literales de cadena. No hagas eso. El hecho de que funcione (a veces) es solo un detalle de implementación en CPython. Además, response is not 'y' or 'n' or 'yes' or 'no'
probablemente no está haciendo lo que crees que es ...
response is not 'y' or 'n' or 'yes' or 'no'
en no hacer lo que crees que hace. Consulte ¿Cómo pruebo una variable con varios valores? y usted debe no utilizaris
para comparar los valores de cadena, el uso==
de comparar los valores , no identidades de objetos.