【问题标题】:Django test is not working with primary keyDjango 测试不使用主键
【发布时间】:2021-03-07 17:58:20
【问题描述】:

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')

当我运行此代码时,它返回 django.urls.exceptions.NoReverseMatch: Reverse for 'blogpost' with arguments '(None,)' not found. 1 pattern(s) tried: ['blogapp/post/(?P<pk>[0-9]+)/$'],但正如您在我的 urls.py 中看到的,当我使用 args=[1] 时,它返回 404!=200

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

第二个路径是指那个 url,但为什么它在 test.py 中不起作用,

【问题讨论】:

  • 您是否在设置中创建博文?
  • 是的,我正在创建一篇博文,以便创建更多测试来检查其内容。

标签: django django-testing


【解决方案1】:

您应该首先创建一个Blog 对象,然后使用该对象的主键:

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)

【讨论】:

  • 对不起,但我在那个类中有 setUp 函数,我忘了把它添加为 ``` setUp(self): self.user = BlogappModel.objects.create( ) ```当我在 args 中将它用作“self.user.pk”时,它返回 None
  • @deepeshjha:但你应该使用self.post.pk,而不是self.user.pk,因为pk(通常)处理Blog对象的主键,而不是用户。跨度>
  • 我做了,但还是不行,我刚刚更新了上面的代码,请你再检查一下。
  • @deepeshjha:您没有在数据库端创建它。您只构造了一个对象,但没有将其保存到数据库中。
  • 哦,现在我明白了,如果我在 setUp() 末尾添加 self.post.save() 它将起作用并且确实如此。谢谢你
猜你喜欢
  • 2021-06-23
  • 2022-01-21
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2016-08-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多