单独运行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
相关产品推荐
相关产品推荐

