0

I have the following block in my 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

This works as expected. But how do I test this? When I tried the following test case. It raises Http404 exception but then causes further exception for NoReverseMatch.

test code:

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)

Here is the full traceback:

.....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, *args, **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, secure=secure, **{
  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, *args, **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 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 192, in render
    return template.render(context)
  File "myproject\venv\lib\site-packages\django\template\base.py", line 172, 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 192, in render
    return template.render(context)
  File "myproject\venv\lib\site-packages\django\template\base.py", line 172, 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\defaulttags.py", line 312, in render
    return 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\defaulttags.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, *args, **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_]+)/$']

Why post_slug is empty?

Ken
  • 859
  • 2
  • 14
  • 33

0 Answers0