如何在测试中使用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
相关产品推荐
相关产品推荐

