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

如何在pytest中对函数内调用的函数进行Mock测试?

解决方案:用pytest Mock func1测试func2(无需修改原函数)

核心逻辑:要Mock的是func2所在模块中对func1的引用,而非func1本身的定义,这样完全不需要修改原函数。

假设你的代码结构如下:

# my_module.py
def func1():
    return 5

def func2(param1, param2):
    var1 = func1()
    return param1 + param2 + var1

方法1:测试函数内直接Mock

# test_my_module.py
import pytest
from unittest import mock
from my_module import func2

def test_func2_mocked():
    # 重点:patch路径是func2所在模块的func1
    with mock.patch("my_module.func1", return_value=10):
        result = func2(2, 3)
        assert result == 2 + 3 + 10  # 验证结果为15

方法2:用pytest Fixture复用Mock逻辑

如果多个测试需要复用这个Mock,可以用Fixture,无需使用self(函数式测试不需要类实例):

# test_my_module.py
import pytest
from unittest import mock
from my_module import func2

@pytest.fixture
def mocked_func1():
    with mock.patch("my_module.func1", return_value=10) as mock_obj:
        yield mock_obj

def test_func2_with_fixture(mocked_func1):
    result = func2(2, 3)
    assert result == 15
    # 可选:验证func1是否被调用了一次
    mocked_func1.assert_called_once()

原写法的问题说明

  1. 路径错误:直接写"func1"会让Python在测试模块中寻找该函数,而非func2所在模块的func1引用,导致Mock不生效;
  2. 不必要的self:如果是函数式测试(非测试类),Fixture不需要self参数;
  3. 无需修改原函数:正确的Patch方式完全不需要改动func1或func2的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:24:31