[英]Python deactivate loguru.logger.catch() function when run in pytest
我正在使用 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)
您可以嘗試使用 loguru 禁用方法 logger.disable logger.disable(None)
。
根據您的代碼結構,您可以傳遞模塊的名稱而不是 None 來禁用該模塊的日志記錄。
使用logger.enable(...)
之后,您可以為其他測試重新啟用日志記錄。
有關更多詳細信息,請參閱禁用方法的 loguru 文檔。
問題歸結為何時應用裝飾器。 到測試收集完成時,裝飾器已經應用於函數。 因此,我們有兩種選擇:
在下面的代碼中,我展示了前一種方法。 此代碼還假定您的測試文件位於與實際代碼不同的文件中。
# 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 =================================================
請在此處閱讀此出色答案以了解更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.