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

pytest中Mock导入模块变量未生效的原因咨询

问题原因及修复方案

核心问题

你在test_a.py里用from configs import abc直接把abc导入到了当前模块的命名空间,这会在导入时把configs.abc的初始值('Old value')复制一份到test_a模块的abc变量中。而你用mock.patch('configs.abc')修改的是configs模块里的abc,但test_a里的abc已经是一个独立的引用,不会跟着模块里的变量变化,所以断言永远失败。

两种修复方式

方式一:保留模块引用,不直接导入变量

修改导入方式,通过模块访问变量,这样每次访问的都是configs模块里的最新值:

import configs
import pytest
from unittest import mock

def test_a():
    with mock.patch('configs.abc', 'New value'):
        assert configs.abc == 'New value'

方式二:直接patch当前模块里的abc引用

如果想保留原导入方式,就直接patch当前模块中abc的引用:

from configs import abc
import pytest
from unittest import mock

def test_a():
    with mock.patch(__name__ + '.abc', 'New value'):
        assert abc == 'New value'

原理说明

unittest.mock.patch的本质是替换指定路径下的对象引用,它只能修改你指定的那个命名空间里的对象。如果已经把对象导入到其他命名空间,那个命名空间里的旧引用不会被自动更新,必须直接patch该引用所在的位置。

内容的提问来源于stack exchange,提问作者Edgar Navasardyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:14