我使用loguru.logger.catch()函数来记录一些输出。另外,当我用pytest测试我的类时,我想要禁用这个函数。我试过用猴子贴片,但没用。我该如何处理这种情况?
示例代码:
class DividerClass:
@logger.catch
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
if self.num2 == 0:
raise ZeroDivisionError
else:
self.result = self.num1 / self.num2
logger.info(f"DividerClass {self.num1} / {self.num2} = {self.result}")
def test_divider_class_with_zero(monkeypatch):
monkeypatch.setattr(loguru.logger, "catch", lambda x: x)
with pytest.raises(ZeroDivisionError):
DividerClass(0, 0)发布于 2022-07-19 11:52:29
这个问题可以归结为何时应用装饰师。当测试集完成时,装饰器已经应用于该功能。因此,我们有两个选择:
在下面的代码中,我展示了前一种方法。此代码还假定您的测试文件与实际代码位于单独的文件中。
# src/manager.py
from loguru import logger
class DividerClass:
@logger.catch
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
if self.num2 == 0:
raise ZeroDivisionError
else:
self.result = self.num1 / self.num2
logger.info(f"DividerClass {self.num1} / {self.num2} = {self.result}")
# tests/test_manager.py
import pytest
import loguru
def test_divider_class_with_zero(monkeypatch):
monkeypatch.setattr(loguru.logger, "catch", lambda x: x)
# notice the import happens after the patch
from src.manager import DividerClass
with pytest.raises(ZeroDivisionError):
DividerClass(0, 0)=============================================== test session starts ================================================
platform darwin -- Python 3.8.9, pytest-7.0.1, pluggy-1.0.0
rootdir: ***
plugins: asyncio-0.18.3, xdist-2.5.0, forked-1.4.0, hypothesis-6.48.1, mock-3.7.0
asyncio: mode=strict
collected 1 item
tests/test_manager.py . [100%]
================================================ 1 passed in 0.02s =================================================请阅读这个优秀的答案这里来了解更多。
发布于 2022-07-19 10:43:56
您可以尝试使用loguru禁用方法logger.disable(None)。
根据代码的结构,您可以传递模块的名称而不是None来禁用该模块的日志记录。
使用logger.enable(...)之后,您可以重新启用其他测试的日志记录。
有关更多详细信息,请参阅禁用方法的loguru文档。
https://stackoverflow.com/questions/73034846
复制相似问题