Django test is not working with primary key

Viewed 503

test.py

from django.test import TestCase, Client, SimpleTestCase
from django.urls import reverse, resolve
from .models import BlogappModel
from django.contrib.auth import get_user_model
from .views import Blogapphome, Blogpostview

class TestUrls(SimpleTestCase):

    def test_list_view_url(self):
        url = reverse('blogapp')
        self.assertEqual( resolve(url).func.view_class, Blogapphome)

    def test_detail_view_url(self):
        url = reverse('blogpost', args=[1,])
        self.assertEqual( resolve(url).func.view_class, Blogpostview)

class BlogTest(TestCase):

   def setUp(self):

        self.user = get_user_model().objects.create(
            username='testuser',
            email='test@gamil.com',
            password='secrete'
        )

        self.post = BlogappModel(
            title='testing', 
            author=self.user, 
            post='bla bla bla',
        )

    def test_post_detail_view(self):

        response = self.client.get(reverse('blogpost', args=[self.post.pk]))

        self.assertEqual(response.status_code , 200)

        print('All tests are successful')

When I'm running this code it returns django.urls.exceptions.NoReverseMatch: Reverse for 'blogpost' with arguments '(None,)' not found. 1 pattern(s) tried: ['blogapp/post/(?P<pk>[0-9]+)/$'] but as you can see in my urls.py and when I use args=[1] it's returning 404!=200

urlpatterns = [
    path('', views.Blogapphome.as_view(), name='blogapp'),
    path('post/<int:pk>/', views.Blogpostview.as_view(), name='blogpost')
]

second path is referring to that url but why it's not working in test.py,

1 Answers

You should first create a Blog object, and then use the primary key of that object:

class TestUrls(SimpleTestCase):

    # …

    def setUp(self):
        # …
        self.post = BlogappModel.objects.create(
            title='testing', 
            author=self.user, 
            post='bla bla bla',
        )

    def test_detail_view_url(self):
        url = reverse('blogpost', args=[self.blog.pk,])
        self.assertEqual( resolve(url).func.view_class, Blogpostview)
Related