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
相关产品推荐
相关产品推荐

