如何解决Django测试Http404异常会导致进一步的NoReverseMatch
我的DetailView中有以下代码段
def get_object(self):
post = get_object_or_404(
Post.objects \
.select_related('author') \
.prefetch_related('comments'),\
slug=self.kwargs['post_slug'])
if post.status == Post.PUBLIC:
return post
elif post.author == self.request.user:
return post
else:
raise Http404
这按预期工作。但是我该如何测试?当我尝试以下测试用例时。它会引发Http404
异常,但会进一步导致NoReverseMatch
异常。
测试代码:
def test_private_post_detail_as_anonymous(self):
"""
Show 404 for anonymous users who visit private post.
"""
self.client.logout()
print(self.post2.slug) # This works! Prints '1v2ygm-test-post-2'
response = self.client.get(
reverse('posts:post-detail',kwargs={'post_slug': self.post2.slug}),follow=True) # Fails here,saying post_slug is ''. Why?
self.assertEqual(response.status_code,404)
这是完整的追溯:
.....Internal Server Error: /posts/1v2ygm-test-post-2/
E
Traceback (most recent call last):
File "myproject\venv\lib\site-packages\django\core\handlers\exception.py",line 47,in inner
response = get_response(request)
File "myproject\venv\lib\site-packages\django\core\handlers\base.py",line 179,in _get_response
response = wrapped_callback(request,*callback_args,**callback_kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\base.py",line 73,in view
return self.dispatch(request,*args,**kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\base.py",line 101,in dispatch
return handler(request,**kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\detail.py",line 106,in get
self.object = self.get_object()
File "myproject\myproject\posts\views.py",line 75,in get_object
raise Http404
django.http.response.Http404
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
File "myproject\myproject\posts\tests\test_views.py",line 263,in test_private_post_detail_as_anonymous
response = self.client.get(
File "myproject\venv\lib\site-packages\django\test\client.py",line 732,in get
response = super().get(path,data=data,secure=secure,**extra)
File "myproject\venv\lib\site-packages\django\test\client.py",line 393,in get
return self.generic('GET',path,**{
File "myproject\venv\lib\site-packages\django\test\client.py",line 470,in generic
return self.request(**r)
File "myproject\venv\lib\site-packages\django\test\client.py",line 709,in request
self.check_exception(response)
File "myproject\venv\lib\site-packages\django\test\client.py",line 571,in check_exception
raise exc_value
File "myproject\venv\lib\site-packages\django\core\handlers\exception.py",line 121,in get_exception_response
response = callback(request,**{**param_dict,'exception': exception})
File "myproject\venv\lib\site-packages\django\utils\decorators.py",line 130,in _wrapped_view
response = view_func(request,**kwargs)
File "myproject\venv\lib\site-packages\django\views\defaults.py",line 60,in page_not_found
body = template.render(context,request)
File "myproject\venv\lib\site-packages\django\template\backends\django.py",line 61,in render
return self.template.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py",line 170,in render
return self._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py",line 96,in instrumented_test_render
return self.nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py",line 938,in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py",line 905,in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\loader_tags.py",line 150,in render
return compiled_parent._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py",line 192,in render
return template.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py",line 172,in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\defaulttags.py",line 312,in render
return nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py",line 446,in render
url = reverse(view_name,args=args,kwargs=kwargs,current_app=current_app)
File "myproject\venv\lib\site-packages\django\urls\base.py",line 87,in reverse
return iri_to_uri(resolver._reverse_with_prefix(view,prefix,**kwargs))
File "myproject\venv\lib\site-packages\django\urls\resolvers.py",line 685,in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'post-detail' with keyword arguments '{'post_slug': ''}' not found. 1 pattern(s) tried: ['posts/(?P<post_slug>[-a-zA-Z0-9_]+)/$']
为什么post_slug
为空?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。