tests - unittest python español
¿Cómo probar con Unittest de Python que se ha lanzado una advertencia? (4)
Tengo una función siguiente en Python y quiero probar con unittest que si la función obtiene 0 como argumento, arroja una advertencia. Ya probé assertRaises, pero como no planteo la advertencia, eso no funciona.
def isZero( i):
if i != 0:
print "OK"
else:
warning = Warning( "the input is 0!")
print warning
return i
Gracias, Tomás
Comenzando con Python 3.2, puede simplemente usar el método assertWarns()
.
with self.assertWarns(Warning):
do_something()
La answer @ire_and_curses es bastante útil y, creo, canónica. Aquí hay otra manera de hacer lo mismo. Esto requiere la excelente biblioteca Mock
Michael Foord.
import unittest, warnings
from mock import patch_object
def isZero( i):
if i != 0:
print "OK"
else:
warnings.warn( "the input is 0!")
return i
class Foo(unittest.TestCase):
@patch_object(warnings, ''warn'')
def test_is_zero_raises_warning(self, mock_warn):
isZero(0)
self.assertTrue(mock_warn.called)
if __name__ == ''__main__'':
unittest.main()
El nifty patch_object
te permite patch_object
el método warn
.
Puede escribir su propia función assertWarns para encapsular el contexto catch_warnings. Lo acabo de implementar de la siguiente manera, con un mixin:
class WarningTestMixin(object):
''A test which checks if the specified warning was raised''
def assertWarns(self, warning, callable, *args, **kwds):
with warnings.catch_warnings(record=True) as warning_list:
warnings.simplefilter(''always'')
result = callable(*args, **kwds)
self.assertTrue(any(item.category == warning for item in warning_list))
Un ejemplo de uso:
class SomeTest(WarningTestMixin, TestCase):
''Your testcase''
def test_something(self):
self.assertWarns(
UserWarning,
your_function_which_issues_a_warning,
5, 10, ''john'', # args
foo=''bar'' # kwargs
)
La prueba pasará si al menos una de las advertencias emitidas por your_function
es de tipo UserWarning.
Puede usar el catch_warnings
contexto catch_warnings
. Esencialmente, esto le permite simular el controlador de advertencias para que pueda verificar los detalles de la advertencia. Consulte los documentos oficiales para obtener una explicación más completa y un código de prueba de muestra.
import warnings
def fxn():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to always be triggered.
warnings.simplefilter("always")
# Trigger a warning.
fxn()
# Verify some things
assert len(w) == 1
assert issubclass(w[-1].category, DeprecationWarning)
assert "deprecated" in str(w[-1].message)