无法Mock环境变量与get_scope方法,数据库连接测试失败求助
问题分析与解决
核心原因:Mock路径错误 + 初始化时机问题
1. Mock目标路径不对
你的数据库选择逻辑代码(假设在app.database.service模块中)是直接将get_scope导入到当前模块命名空间的:
from app.resources.scope import get_scope
模块运行时,会把get_scope的引用存到app.database.service的命名空间里。你测试中 patch 的是app.resources.scope.get_scope,但实际调用的是app.database.service里的本地引用,导致mock完全没生效,自然不会被调用。
解决方法:
把测试中的patch路径改成数据库选择逻辑所在模块的get_scope,比如如果数据库选择逻辑在app.database.service里,就改成:
@patch("app.database.service.get_scope")
2. setUp中提前初始化导致Mock失效
你的setUp方法里提前初始化了Database_Service(),这会在测试方法的mock设置之前就调用真实的get_scope,导致测试方法里的mock无法覆盖这次调用。
解决方法:
删除setUp里的self.db = Database_Service(),只在测试方法里按需初始化:
def setUp(self): self.app = app.create_app().test_client() self.app.testing = True # 移除该行:self.db = Database_Service()
修正后的测试代码示例
@patch("app.database.service.Database_Service.__new__") class DatabaseServiceTest(TestCase): def setUp(self): self.app = app.create_app().test_client() self.app.testing = True @patch("app.database.service.get_scope") # 修正patch路径 @patch("app.database.service.secrets.get_secret") def test_init_prod_scope(self, mock_get_secret, mock_get_scope, mock_auth): mock_get_scope.return_value = "prod" _ = Database_Service() # 在这里才初始化实例 mock_get_scope.assert_called_once() # 现在会通过断言 mock_get_secret.assert_not_called()
额外注意:模块级变量的初始化问题
你的scope.py里的SCOPE是模块级变量,在模块首次加载时就会调用get_env赋值。如果后续想通过mockget_env改变SCOPE,需要重新加载模块或者直接mock模块的SCOPE变量,但这次你用的是mockget_scope,修正patch路径后就不需要处理这个点了。
内容的提问来源于stack exchange,提问作者Juan David Serna
相关产品推荐
相关产品推荐

