Tengo un método de Python 2.7 que a veces llama
sys.exit(1)
¿Es posible hacer una prueba unitaria que verifique que se llame a esta línea de código cuando se cumplen las condiciones adecuadas?
python
unit-testing
Oso travis
fuente
fuente
Respuestas:
Si.
sys.exit
aumentaSystemExit
, para que puedas comprobarlo conassertRaises
:Las instancias de
SystemExit
tienen un atributocode
que se establece en el estado de salida propuesto, y el administrador de contexto devuelto porassertRaises
tiene la instancia de excepción capturada comoexception
, por lo que verificar el estado de salida es fácil:Documentación de sys.exit :
fuente
sys.exit(1)
(a diferencia de, digamos,sys.exit(0)
) debes afirmar quecode
es 1. ¿Supongo que podrías hacer eso conassertRaisesRegexp(SystemExit, '1')
?unittest
método que le permite pasar una excepción y un predicado invocable para ejecutar en la excepción o sus argumentos, en lugar de solo un patrón de expresión regular para ejecutar en la representación de cadena de su primer argumento ... pero supongo que no. ¿Hay algún otro módulo de prueba en el que esté pensando?self.assertRaisesRegex( SystemExit, '^2$', testMethod )
Menos código, lo suficientemente legible.self.assertRaisesRegexp
Aquí hay un ejemplo de trabajo completo. A pesar de la excelente respuesta de Pavel, me tomó un tiempo darme cuenta de esto, así que lo incluyo aquí con la esperanza de que sea útil.
fuente
Encontré la respuesta a su pregunta en la búsqueda de documentación de pruebas unitarias de Python para "Prueba de excepciones". Usando su ejemplo, la prueba unitaria se vería así:
Recuerde incluir todos los argumentos necesarios para probar su función.
fuente
Como nota adicional a la excelente respuesta de Pavel, también puede verificar estados específicos si se proporcionan en la función que está probando. Por ejemplo, si
your_method()
contiene lo siguientesys.exit("Error")
, sería posible realizar una prueba de "Error" específicamente:fuente