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
相关产品推荐
相关产品推荐

