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

单独运行Mock测试通过,批量运行时断言函数调用失败

批量运行Pytest时Mock函数断言调用失败的解决方法

问题场景

要测试视图中的my_function是否被调用,视图代码如下:

@api_view(["POST"])
def my_view(request):
    data = request.data
    my_function(data)
    return Response("ok")

对应的测试代码:

@pytest.fixture
def mock_my_function(mocker):
    return mocker.patch("path.for.my.function")

def test_my_test(mock_my_function, db, client):
    data = {"some": "thing"}
    resp = client.post(
        "/my/url/",
        data=data,
        format="json",
    )
    assert resp.data == "ok"
    mock_my_function.assert_called()

单独运行该测试正常,但批量运行所有测试时,出现报错:

E       AssertionError: Expected 'mock_my_function' to have been called.

解决方法

核心问题是Mock的路径不正确,需要修改patch的目标路径:

步骤1:调整Mock路径

确保patch的是视图模块中导入的my_function实例,而非原函数的定义路径。

比如你的视图文件是myapp/views.py,且在该文件中通过from path.for.my import my_function导入了目标函数,那么修改fixture的patch路径为:

@pytest.fixture
def mock_my_function(mocker):
    # 替换为你视图所在模块的实际路径
    return mocker.patch("myapp.views.my_function")

原因说明

当视图模块导入my_function时,会在本地创建一个指向该函数的引用。如果直接patch原函数的定义路径,批量测试时可能因模块加载顺序、其他测试的Mock干扰等原因,导致视图中的本地引用未被替换,最终Mock未生效。而patch视图模块内的本地引用,能确保拦截到视图实际调用的函数实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:10:31