Python中文件内函数Mock失败问题求助
问题分析与解决方案
核心问题
你的Mock失败主要源于两个关键问题:
- 模块加载时提前执行目标函数:
dummy.py中gql = create_graphql_client(config)属于模块级代码,在导入dummy模块(甚至测试函数执行前)就已执行,此时测试里的Patch还未生效,导致gql被赋值为真实函数的返回值。 - Patch路径错误:你测试中Patch的是
dummy.adapter.create_graphql_client,但dummy.py是直接从core.connection_util导入create_graphql_client,该函数在dummy模块内的实际引用路径为dummy.create_graphql_client,路径不匹配导致Mock失效。
解决方案
方案一:调整业务代码(推荐)
修改dummy.py,将gql的初始化延迟到函数调用阶段,避免模块加载时提前执行:
from core.connection_util import create_graphql_client def get_instance(): config = settings.ABCD gql = create_graphql_client(config) return gql
之后修正测试代码的Patch路径即可:
from unittest.mock import patch from dummy import get_instance import settings def test_get_instance(): with patch('dummy.create_graphql_client') as mocked_create_graphql_client: mocked_gql = 'Mocked GraphQL Client' mocked_create_graphql_client.return_value = mocked_gql instance = get_instance() assert instance == mocked_gql mocked_create_graphql_client.assert_called_once_with(settings.ABCD)
方案二:不修改业务代码,调整测试逻辑
如果无法改动dummy.py,可以在Patch后重新加载模块,让模块级代码重新执行时使用Mock函数:
import importlib from unittest.mock import patch import dummy import settings def test_get_instance(): with patch('dummy.create_graphql_client') as mocked_create_graphql_client: mocked_gql = 'Mocked GraphQL Client' mocked_create_graphql_client.return_value = mocked_gql # 重新加载dummy模块,触发模块级代码重新执行 importlib.reload(dummy) instance = dummy.get_instance() assert instance == mocked_gql mocked_create_graphql_client.assert_called_once_with(settings.ABCD)
若使用pytest的mocker fixture,逻辑一致:
import importlib import dummy import settings def test_get_instance(mocker): mocked_create_graphql_client = mocker.patch('dummy.create_graphql_client') mocked_gql = 'Mocked GraphQL Client' mocked_create_graphql_client.return_value = mocked_gql importlib.reload(dummy) instance = dummy.get_instance() assert instance == mocked_gql mocked_create_graphql_client.assert_called_once_with(settings.ABCD)
内容的提问来源于stack exchange,提问作者bl_nk
相关产品推荐
相关产品推荐

