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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:36:01