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

Python中文件内函数Mock失败问题求助

问题分析与解决方案

核心问题

你的Mock失败主要源于两个关键问题:

  1. 模块加载时提前执行目标函数:dummy.py中gql = create_graphql_client(config)属于模块级代码,在导入dummy模块(甚至测试函数执行前)就已执行,此时测试里的Patch还未生效,导致gql被赋值为真实函数的返回值。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:05:16