首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pytest中运行loguru.logger.catch()函数

在pytest中运行loguru.logger.catch()函数
EN

Stack Overflow用户
提问于 2022-07-19 09:56:07
回答 2查看 233关注 0票数 1

我使用loguru.logger.catch()函数来记录一些输出。另外,当我用pytest测试我的类时,我想要禁用这个函数。我试过用猴子贴片,但没用。我该如何处理这种情况?

示例代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-19 11:52:29

这个问题可以归结为何时应用装饰师。当测试集完成时,装饰器已经应用于该功能。因此,我们有两个选择:

  1. 修补后导入所需的对象
  2. 修补后重新加载模块

在下面的代码中,我展示了前一种方法。此代码还假定您的测试文件与实际代码位于单独的文件中。

代码语言:javascript
复制
# 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)
代码语言:javascript
复制
=============================================== 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 =================================================

请阅读这个优秀的答案这里来了解更多。

票数 0
EN

Stack Overflow用户

发布于 2022-07-19 10:43:56

您可以尝试使用loguru禁用方法logger.disable(None)

根据代码的结构,您可以传递模块的名称而不是None来禁用该模块的日志记录。

使用logger.enable(...)之后,您可以重新启用其他测试的日志记录。

有关更多详细信息,请参阅禁用方法的loguru文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73034846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档