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

pytest mock被测类导入的函数无法返回fixture值该如何修复?

问题原因

  • fixture定义缺失def关键字,语法不合法无法正常加载
  • 直接将fixture函数作为mock的return_value,实际返回的是函数对象而非fixture返回的字符串值
  • 测试函数未声明fixture作为入参,pytest不会自动注入fixture的返回值
  • mock装饰器的参数会在测试函数执行前解析,此时fixture还未初始化,不能直接在patch装饰器中引用fixture

修复方案

1. 修正fixture定义

get_sth_test.py补全fixture的函数定义语法:

import pytest

@pytest.fixture
def get_sth_mock_test():
    return 'mocked value'

2. 调整测试用例写法

在测试函数内部给mock对象设置return_value,此时fixture已经完成注入可以直接取值,MyClass_test.py代码调整如下:

from unittest import mock
from get_sth_test import get_sth_mock_test
from MyClass import MyClass

@mock.patch('MyClass.get_sth')
def test_MyClass(get_sth_mock, get_sth_mock_test):
    # 给mock对象设置fixture返回值作为返回结果
    get_sth_mock.return_value = get_sth_mock_test
    instance = MyClass()
    # 验证示例:确认返回值符合预期
    assert instance.sth == 'mocked value'

可选简化方案(使用pytest-mock)

如果安装了pytest-mock插件,可以进一步简化写法,不需要单独写patch装饰器:

from get_sth_test import get_sth_mock_test
from MyClass import MyClass

def test_MyClass(mocker, get_sth_mock_test):
    mocker.patch('MyClass.get_sth', return_value=get_sth_mock_test)
    instance = MyClass()
    assert instance.sth == 'mocked value'

验证说明

调整后执行测试,MyClass初始化时调用的get_sth会被mock替换,直接返回fixture的mocked value,不会执行原外部函数。

内容的提问来源于stack exchange,提问作者Jarosław Rewers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:12:02