monkeypatch 使用 pytest 记录 basicConfig

问题描述 投票:0回答:1

我有一个涉及设置记录器的功能:

app/src/app/pipelines.py

import logging

def get_log_handlers(filepath):
    return [logging.FileHandler(filepath, 
                                'w'),
            logging.StreamHandler()
            ]

def function(results_dir):
    log_handlers= get_log_handlers(f'{results_dir}\\log.txt')
    logging.basicConfig(
                    level=logging.INFO,
                    format='%(asctime)s %(levelname)s:  %(message)s',
                    handlers=log_handlers
                )
    
    logger = logging.getLogger()
    logger.info('---PARAMETERS---')

我想使用 pytest 测试日志记录是否按预期进行,但不想写入文件,因此在我的测试文件中,我调用

function
和 Monkeypatch 处理程序生成函数,以便
FileHandler
是测试省略:

app/tests/test_pipelines.py

from io import StringIO
import logging

def test_function(monkeypatch):
    def mock_get_log_handlers(path):
        nonlocal test_stream
        return [logging.StreamHandler(test_stream)]
    test_stream = StringIO()
    monkeypatch.setattr('app.pipelines.get_log_handlers', mock_get_log_handlers)
    function1('result_dir')
    test_stream.seek(0)
    content = test_stream.readlines()
    assert content[0] == '---PARAMETERS---'

我的模拟被调用,但没有任何内容写入 test_stream (

AssertionError: assert [] == ['---PARAMETERS---']
)。

我做错了什么?

python logging pytest monkeypatching stringio
1个回答
0
投票

我无法让我原来的解决方案发挥作用,但对于遇到此问题的其他人来说,似乎您应该使用 pytest caplog 固定装置。 我的工作代码如下所示:

def test_function(monkeypatch, caplog):
    #remove the FileHandler that is returned by get_log_handlers()
    def mock_get_log_handlers(path):
        return [logging.StreamHandler()]
    monkeypatch.setattr('app.pipelines.get_log_handlers', mock_get_log_handlers)
    #note logging level is specific to my basicConfig
    with caplog.at_level(logging.INFO):
        function1('result_dir')
        assert caplog.messages == ['---PARAMETERS---']
© www.soinside.com 2019 - 2024. All rights reserved.