Python在保留日志输出的同时模拟日志记录

时间:2017-05-26 14:47:34

标签: python unit-testing testing logging mocking

我有一系列使用python logging module的单元/集成测试。我想在适当的时候测试正确的事情,我可以使用mock模块实现,如下所示:

@mock.patch('logging.Logger.info')

然而,当我这样做时,实际的日志记录被停止了(原因很明显!),这对我调试我的测试工作原理等很有用。

我的问题如下:有没有办法解释为什么我可以模拟日志记录调用,所以我可以断言它们已经被预期的参数调用但仍然保留了日志记录功能?

我目前的做法是创建一个包含MagicMock和非模拟记录器的包装类:

class MonkeyPatchLogger(object):
    MOCK = mock.MagicMock()
    @classmethod
    def info(cls, *args, **kwargs):
        cls.MOCK(*args, **kwargs)
        logger.info(*args, **kwargs)

但这不起作用。

干杯, 千斤顶

2 个答案:

答案 0 :(得分:0)

我在2010年发布了关于单元测试和日志记录的this - 它应该仍然是相关的。内容太大,无法在答案中总结,因此提供了一个链接。

答案 1 :(得分:0)

你应该看Mock(wraps=...)

  

wrapps:要包装的模拟对象的项目。如果换行不是None,则调用Mock会将调用传递给包装对象(返回实际结果)。模拟器上的属性访问将返回一个Mock对象,该对象包装被包装对象的相应属性(因此,尝试访问不存在的属性将引发AttributeError)。

     

如果mock具有显式的return_value设置,则调用不会传递给包装对象,而是返回return_value。