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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...