Puede crear un controlador personalizado que pueda verificar el mensaje enviado a través del registro. El BufferingHandler es la combinación perfecta para este trabajo.
Es posible que también desee adjuntar en su prueba el controlador a cualquier registrador que esté utilizando en su código, como logging.getLogger('foo').addHandler(...)
. Eventualmente podría adjuntar el controlador en los métodos setUp
y tearDown
de su caso de prueba.
import logging
import logging.handlers
class AssertingHandler(logging.handlers.BufferingHandler):
def __init__(self,capacity):
logging.handlers.BufferingHandler.__init__(self,capacity)
def assert_logged(self,test_case,msg):
for record in self.buffer:
s = self.format(record)
if s == msg:
return
test_case.assertTrue(False, "Failed to find log message: " + msg)
def cook_eggs():
logging.warn("eggs are ready!")
import unittest
class TestLogging(unittest.TestCase):
def test(self):
asserting_handler = AssertingHandler(10)
logging.getLogger().addHandler(asserting_handler)
cook_eggs()
asserting_handler.assert_logged(self,"eggs are ready!")
logging.getLogger().removeHandler(asserting_handler)
unittest.main()
Muy bien, entonces ¿cómo me burlo correctamente del módulo 'logging'? Quiero simular llamadas a, por ejemplo, 'logging.warn (...)' y 'logging.getLogger (" foo "). Warn (...)'? –
(obviamente, puedo averiguar dónde cada bit individual de código está tomando una referencia a un registrador, luego anulo esa referencia ... Pero espero que haya una manera más simple) –
@David Wolever. Mock 'logging' - el módulo. Reemplácelo con un objeto de una clase que tenga la API correspondiente - 'getLogger' y alguna clase simulada' Logger'. Hay herramientas para ayudar con esto. http://www.voidspace.org.uk/python/mock/. –