如何在python单元测试中模拟导入模块中的全局变量?

如何在python单元测试中模拟导入模块中的全局变量?,python,python-3.x,unit-testing,pytest,python-unittest,Python,Python 3.x,Unit Testing,Pytest,Python Unittest,我有一个特殊的场景,如下面的帖子 但不同的是,我的数据库模块还有一个全局变量,需要模拟 """Initialzation""" from database.db_init import DB from common.common_util import CommonUtil as util db_username = util.get_value_from_ssm_parameter_store( '/_userna

我有一个特殊的场景,如下面的帖子

但不同的是,我的数据库模块还有一个全局变量,需要模拟

    """Initialzation"""
from database.db_init import DB
from common.common_util import CommonUtil as util

db_username = util.get_value_from_ssm_parameter_store(
    '/_username')
db_password = util.get_value_from_ssm_parameter_store(
    '/rds/_password')
db_host = DB.get_rds_host()


def create_session():
    """this will create a db session"""
    db = DB(user=db_username, password=db_password,
            host=db_host, database='test')
    Session = db.getSession()
    session = Session()
    return session
我模拟了从_ssm_parameter_store()函数中获取_value_,甚至模拟变量为@patch('database.db_username','test'),还尝试在我的unittest类中使用database.db_username=MagicMock(return_value='test')


但aws仍然面临着挑战。有人能帮我模拟导入模块中的全局变量吗?

因为
util.get\u value\u from\u ssm\u parameter\u store()
DB.get\u rds\u host()
方法在
session.py
的模块范围内执行

在从
session
模块导入
create\u session
功能之前,应先修补这些方法

例如

common/common_util.py

class CommonUtil:
@静力学方法
def从参数存储(键)获取值:
打印('调用真实aws')
数据库/db_init.py

课堂会话:
通过
DB类:
@静力学方法
def get_rds_host():
返回“127.0.0.1”
def uuu init uuuu(自我、用户、密码、主机、数据库)->无:
通过
def getSession(self):
返回会话
session.py

from database.db\u init import db
从common.common_util导入CommonUtil作为util
db\u username=util.get\u value\u from\u ssm\u parameter\u store(
“/\u用户名”)
db\u password=util.get\u value\u来自\u ssm\u参数\u存储(
“/rds/_密码”)
db_host=db.get_rds_host()
def create_会话():
“”“这将创建数据库会话”“”
db=db(用户=db\u用户名,密码=db\u密码,
host=db\u主机,数据库='test')
Session=db.getSession()
会话=会话()
返回会话
测试会话.py

导入单元测试
从unittest.mock导入补丁,mock,调用
从common.common_util导入CommonUtil作为util
从database.db_init导入数据库
def get_value_from_ssm_参数_store_副作用(键):
如果key=='/_username':
返回“邓丽君”
如果key=='/rds/_password':
返回“123456”
原始\u从\u ssm\u参数\u存储获取\u值\u=util.get\u值\u从\u ssm\u参数\u存储获取
原始\u获取\u rds\u主机=DB.get\u rds\u主机
util.get_value_from_ssm_parameter_store=Mock(side_effect=get_value_from_ssm_parameter_store_side_effect)
DB.get\u rds\u host=Mock(返回值=192.168.1.1')
类TestSession(unittest.TestCase):
@修补程序('session.DB',autospec=True)
def测试创建会话(自、模拟数据库):
从会话导入创建会话
db\u instance=mock\u db.return\u值
mock_session=mock()
db_instance.getSession.return_value=mock_session
创建会话()
mock_DB.assert_用('teresa teng','123456','192.168.1.1','test'一次调用___)
util.get_value_from_ssm_parameter_store.assert_有_调用([call('/_username')、call('/rds/_password'))
db_instance.getSession.assert_调用了_once()
#恢复模拟
util.get_value_from_ssm_parameter_store=原始_get_value_from_ssm_parameter_store
DB.get\u rds\u host=原始\u get\u rds\u主机
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
单元测试结果:

 ⚡  coverage run /Users/dulin/workspace/github.com/mrdulin/python-codelab/src/stackoverflow/64329623/test_session.py && coverage report -m --include='./src/**'
.
----------------------------------------------------------------------
Ran 1 test in 0.011s

OK
Name                                               Stmts   Miss  Cover   Missing
--------------------------------------------------------------------------------
src/stackoverflow/64329623/common/common_util.py       4      1    75%   4
src/stackoverflow/64329623/database/db_init.py        10      3    70%   8, 11, 14
src/stackoverflow/64329623/session.py                 10      0   100%
src/stackoverflow/64329623/test_session.py            28      0   100%
--------------------------------------------------------------------------------
TOTAL                                                 52      4    92%