mocking a logging object

Diez B. Roggisch deets at nospam.web.de
Mon Jun 2 13:34:29 CEST 2008


Peter Bengtsson wrote:

> In my unittest I want to override the logger of a working module so
> that it puts all logging messages in /tmp/test.log instead so that in
> my unittest I can inspect that it logs things correctly. Hopefully
> this "pseudo" code will explain my problem::
> 
>>>> import logging, os
>>>> logging.basicConfig(filename='/tmp/real.log', level=logging.INFO)
>>>> logger = logging.getLogger('Real')
>>>> logger.info('Real stuff')
>>>> os.path.isfile('/tmp/real.log')
> True
>>>> # do the monkey patching like the unit test does
>>>> logging.basicConfig(filename='/tmp/test.log', level=logging.INFO)
>>>> logger = logging.getLogger('Test')
>>>> logger.info('Test stuff')
>>>> os.path.isfile('/tmp/test.log')
> False
>>>> open('/tmp/real.log').read()
> 'INFO:Real:Real stuff\nINFO:Test:Test stuff\n'
> 
> How can I change what file the logger should write to?

You should simply attach a new handler to the logger in question that logs
the data into a stream/StringIO-object for later retrieval. Then remove
that handler after the test.

Diez



More information about the Python-list mailing list