【问题标题】:Python mocking logging while retaining log outputPython 在保留日志输出的同时模拟日志记录
【发布时间】:2017-05-26 14:47:34
【问题描述】:

我有一系列使用 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)

但这不起作用。

干杯, 杰克

【问题讨论】:

    标签: python unit-testing testing logging mocking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      wraps:要包装的模拟对象的项目。如果 wraps 不是 None 那么调用 Mock 会将调用传递给被包装的对象(返回真实结果)。对 mock 的属性访问将返回一个 Mock 对象,该对象包装了被包装对象的相应属性(因此尝试访问不存在的属性将引发 AttributeError)。

      如果 mock 有明确的 return_value 集,则不会将调用传递给被包装的对象,而是返回 return_value。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 2011-12-07
        • 2020-11-03
        • 1970-01-01
        • 2021-05-11
        • 2012-01-12
        • 2017-06-04
        相关资源
        最近更新 更多