我有一个涉及设置记录器的功能:
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---']
)。
我做错了什么?
我无法让我原来的解决方案发挥作用,但对于遇到此问题的其他人来说,似乎您应该使用 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---']