如何在 pytest 中删除重复的 loguru 记录器补丁

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

我正在测试一个在开始时调用

loguru.logger.add("file.log")
的函数。这会导致 pytest 执行期间出现问题。该文件被写入临时目录,因此在清理时被另一个进程(好的 Windows)使用。

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'path/to/tmp_dir/file.log'

一种解决方案是在发生这种情况的每个测试上修补

loguru.logger.add
。但这会导致大量重复(样板?)代码。对于许多测试,我不需要参考
logger.add
,我只需要修补它以便测试运行。

@patch("loguru.logger.add")
def test_one(mock_logger_add):
    ...
    # Useful to check, but don't want to call this in EVERY test
    mock_logger_add.assert_called_once()

@patch("loguru.logger.add")
def test_two(mock_logger_add):
    ...
    # No need to check mock_logger_add, just want my code to run

如何减少这种重复?

我尝试过的事情:

  • autouse=True
    夹具添加到
    conftest.py
    或测试文件/类中

例如

@pytest.fixture(autouse=True)
def patch_logger_add(monkeypatch):
    monkeypatch.setattr("loguru.logger.add", lambda *args, **kwargs: None)
    # or
    # monkeypatch.setattr("loguru.logger.add", MagicMock())

@pytest.fixture(autouse=True)
def no_logger_add(monkeypatch):
    monkeypatch.delattr("loguru.logger.add")

这些不起作用。也许是因为,为了让 loguru 与 pytest 一起工作,我们必须 重新定义

caplog
,这涉及到调用
logger.add

注意:我不想完全关闭 loguru,因为我在测试中检查日志中是否有错误。

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

既然你说

patch
装饰器有效,但
monkeypatch
似乎不起作用,我很好奇在装置中使用
patch
作为上下文管理器是否可以解决你的问题?

示例

@pytest.fixture(autouse=True)
def patch_logger():
    with patch("loguru.logger.add"):
        yield
© www.soinside.com 2019 - 2024. All rights reserved.