我正在测试一个在开始时调用
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,因为我在测试中检查日志中是否有错误。
既然你说
patch
装饰器有效,但 monkeypatch
似乎不起作用,我很好奇在装置中使用 patch
作为上下文管理器是否可以解决你的问题?
示例
@pytest.fixture(autouse=True)
def patch_logger():
with patch("loguru.logger.add"):
yield