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

Django视图未接收unittest Mock,测试中模拟函数失效问题

解决Django测试中patch get_object_or_404无效的问题

问题根源在于你patch的是django.shortcuts.get_object_or_404原函数,但视图里实际使用的是自身模块中已经导入的函数引用——Python的patch机制只会替换指定命名空间下的引用,不会影响已经导入到其他模块的副本。

具体修正步骤:

  • 找到你的视图文件所在模块路径,比如视图文件是your_app/views.py,需要patch的目标是your_app.views.get_object_or_404,而非原函数所在的django.shortcuts模块。
  • 修改测试代码中的patch路径,示例如下:
def test_student_get(admin_user, some_model_fixture):
    client = Client()
    request_with_cookies = set_cookie(client, admin_user[0])

    # 替换成你的视图模块路径,比如myapp.views.get_object_or_404
    with patch('your_app.views.get_object_or_404') as mock_get_object_or_404:
        mock_get_object_or_404.side_effect = Http404

        response_from_view = client.get(
            reverse('student.get'),
            HTTP_REFERER=request_with_cookies.request['PATH_INFO'],
            data={'id': some_model_fixture.id},
            follow=True
        )
    assert response_from_view.status_code == 404

原理补充:

当视图执行from django.shortcuts import get_object_or_404时,Python会把django.shortcuts里的get_object_or_404函数引用复制到视图模块的命名空间中。后续视图调用的是这个本地引用,而非原模块的函数。只有patch视图模块中的这个引用,才能让mock生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:42:58