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

如何用unittest Mock跳过函数内代码行,复用变量值替代返回值

如何在不修改原函数参数的情况下跳过指定代码行进行单元测试?

你完全可以通过Mock工具实现这个需求,核心思路是让store_and_return_foo()返回第一行compute_foo(inputs)生成的foo值,这样第二行的赋值操作不会改变foo的内容,等价于跳过了该行的实际逻辑。以下是具体实现方案:

方案一:Mock依赖函数,控制返回值

如果你想完全控制测试中的数据,可以同时Mockcompute_foo和store_and_return_foo,让它们返回相同的预期值:

from unittest.mock import patch
import my_module

def test_function_to_test():
    test_inputs = "sample_input"
    expected_foo = "mock_foo_result"

    # Mock compute_foo,返回预期值
    with patch("my_module.compute_foo", return_value=expected_foo):
        # 关键:让store_and_return_foo返回和compute_foo一样的值
        with patch("my_module.store_and_return_foo", return_value=expected_foo):
            # Mock do_work,验证它是否收到正确的参数
            with patch("my_module.do_work") as mock_do_work:
                my_module.function_to_test(test_inputs)

                # 验证依赖函数的调用逻辑
                my_module.compute_foo.assert_called_once_with(test_inputs)
                mock_do_work.assert_called_once_with(expected_foo)

方案二:保留compute_foo实际逻辑,仅Mockstore_and_return_foo

如果想使用compute_foo的真实业务逻辑生成foo,只需先获取该值,再让store_and_return_foo返回它即可:

from unittest.mock import patch
import my_module

def test_function_to_test_with_real_compute():
    test_inputs = "sample_input"
    # 先通过真实逻辑获取foo值
    real_foo = my_module.compute_foo(test_inputs)

    # Mock store_and_return_foo,返回真实的foo值
    with patch("my_module.store_and_return_foo", return_value=real_foo):
        with patch("my_module.do_work") as mock_do_work:
            my_module.function_to_test(test_inputs)

            # 验证do_work确实收到了compute_foo生成的foo
            mock_do_work.assert_called_once_with(real_foo)

这两种方式都不需要修改原函数的代码,也不需要添加额外的参数,完全通过测试层的Mock来实现跳过指定行的效果,既保留了生产代码的完整性,又满足了测试需求。

内容的提问来源于stack exchange,提问作者nir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:19:59