如何在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()
原写法的问题说明
- 路径错误:直接写
"func1"会让Python在测试模块中寻找该函数,而非func2所在模块的func1引用,导致Mock不生效; - 不必要的self:如果是函数式测试(非测试类),Fixture不需要
self参数; - 无需修改原函数:正确的Patch方式完全不需要改动func1或func2的代码。
内容的提问来源于stack exchange,提问作者OnePiece
相关产品推荐
相关产品推荐

