pytest单元测试技巧:如何Mock函数内部的本地变量并赋值
pytest单元测试中Mock函数本地变量的方案
针对你给出的get_ldap_groups函数,要修改内部的username、host两个本地变量,有以下几种可行方案,按推荐优先级排序:
方案1:重构原函数(最推荐)
不影响原有业务调用,可测试性最高,是行业通用的最优实践
把内部硬编码的本地变量改为带默认值的入参即可,原有调用逻辑完全不需要调整:
# 重构后的原函数 def get_ldap_groups(host=None, username=None): host = host username = username # 原有后续逻辑不变 result = search(username, host)
测试时直接传入你需要的变量值即可:
def test_ldap_groups(): # 直接赋值测试用的host和username get_ldap_groups(host="test-ldap.server.com", username="test_admin") # 后续添加你的断言逻辑
方案2:Mock下游调用(无需修改原业务代码)
如果你没有权限修改原函数的代码,可以直接Mock内部调用的search函数,要么校验参数,要么强制替换传入的变量值:
from unittest.mock import patch def test_ldap_groups(): # 注意patch的路径要写你实际代码中search被导入的路径 with patch("your_module.search") as mock_search: # 场景1:校验原函数是否正确给search传参 get_ldap_groups() mock_search.assert_called_once_with(None, None) # 场景2:强制替换传入search的username和host值 def mock_side_effect(_, __): # 忽略原函数传的参数,用你自定义的测试值调用真实search return search("mock_user", "mock-ldap.server.com") mock_search.side_effect = mock_side_effect get_ldap_groups()
方案3:直接操作栈帧修改本地变量(极不推荐,仅作特殊场景参考)
这种方法通过修改Python运行时的栈帧强行修改本地变量,和原函数的代码结构强耦合,原函数只要改一行代码(比如加个变量、调整变量顺序)就会失效,非万不得已不要用:
import inspect def test_ldap_groups(): # 实现逻辑非常依赖原函数的字节码结构,业务代码改动就会失效,不建议实际使用 pass
内容的提问来源于stack exchange,提问作者Nitin Lawande
相关产品推荐
相关产品推荐

