2011-02-22 8 views

Respuesta

12

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() 
2

Esto es lo que "Mock Objects" son para.

Puede usar una versión simulada de registro que almacenará adecuadamente los mensajes de registro para que pueda hacer afirmaciones sobre ellos posteriormente.

+0

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 (...)'? –

+0

(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) –

+0

@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/. –

0

Sólo Fwiw, en el proyecto datalad que necesita una funcionalidad similar, sino también para simplemente tragar los registros (y posiblemente introspección). Así que aquí llegó la solución - swallow_logs controlador de contexto: https://github.com/datalad/datalad/blob/master/datalad/utils.py#L296 (actualmente en b633c9da46ab9cccde3d4767928d167a91857153). Entonces ahora en la prueba hacemos algo como

def test_swallow_logs(): 
    lgr = logging.getLogger('datalad') 
    with swallow_logs(new_level=9) as cm: 
     eq_(cm.out, '') 
     lgr.log(8, "very heavy debug") 
     eq_(cm.out, '') # not even visible at level 9 
     lgr.log(9, "debug1") 
     eq_(cm.out, 'debug1\n') # not even visible at level 9 
     lgr.info("info") 
     eq_(cm.out, 'debug1\ninfo\n') # not even visible at level 9 
Cuestiones relacionadas