You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在测试中使用autouse fixture生成的mock_error对象?

解决autouse fixture中无法获取mock引用的问题

问题描述

现有如下带autouse=True的pytest fixture:

@pytest.fixture(autouse=True)
def mock_logger_error(request):
    with mock.patch('logging.Logger.error') as mock_error:
        yield

测试代码中尝试调用mock_error.assert_called_once_with(...)时,会触发“Undefined variable: mock_error”错误。尽管logging.Logger.error的patch已生效,但无法获取mock_error的引用。由于使用yield的fixture无法同时使用return传递数据,需要针对性解决。

解决方案

方案1:将mock对象绑定到request对象

修改fixture,把mock_error赋值给request的自定义属性,测试时通过request对象获取引用:

@pytest.fixture(autouse=True)
def mock_logger_error(request):
    with mock.patch('logging.Logger.error') as mock_error:
        request.mock_error = mock_error
        yield

测试代码示例:

def test_log_error_triggered(request):
    # 执行会触发Logger.error的业务逻辑
    request.mock_error.assert_called_once_with("目标错误信息")

方案2:取消autouse,让测试主动引用fixture

移除autouse=True,将fixture作为参数传入测试函数,直接获取mock对象:

@pytest.fixture
def mock_logger_error():
    with mock.patch('logging.Logger.error') as mock_error:
        yield mock_error

测试代码示例:

def test_log_error_triggered(mock_logger_error):
    # 执行会触发Logger.error的业务逻辑
    mock_logger_error.assert_called_once_with("目标错误信息")

方案3:绑定到测试类属性(适用于类级测试)

如果使用测试类组织用例,可将mock对象绑定到测试类的属性上:

@pytest.fixture(autouse=True)
def mock_logger_error(request):
    with mock.patch('logging.Logger.error') as mock_error:
        if request.cls:
            request.cls.mock_error = mock_error
        yield

测试类示例:

class TestLoggerBehavior:
    def test_error_logged(self):
        # 执行会触发Logger.error的业务逻辑
        self.mock_error.assert_called_once_with("目标错误信息")

内容的提问来源于stack exchange,提问作者mike rodent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:37:36