【问题标题】:django test urls status codedjango 测试 url 状态码
【发布时间】:2018-01-03 00:59:02
【问题描述】:

您好,我为我的项目创建了一些测试,主要是为了丰富我的知识。

我有一些问题。

简单的测试代码:

test.py

from django.test import Client, TestCase
class User_Form_Test(TestCase):
    def test_logged_user_get_details(self):
        response = self.client.get('/details/', follow=True)
        self.assertEqual(response.status_code, 200)

    def test_logged_user_get_details_images(self):
        response = self.client.get('/details-images/', follow=True)
        self.assertEqual(response.status_code, 200)

urls.py

url(r'^details/(?P<id>\d+)/$', views.details, name='details'),
url(r'^details-images/(?P<slug>[^\.]+)/$', views.details_images, name='details_images')

所有这些代码都可以正常工作,我在这两个测试中通过了消息。

我的问题是如何在第一种情况下测试来自id 的所有可能的正则表达式,在第二种情况下自动测试来自slug 的第二个slug

【问题讨论】:

    标签: python django testing


    【解决方案1】:

    首先使用 path() 和 re_path(),我认为 url() 被贬低甚至被移除了。
    查看您的正则表达式模式看起来您已将 idslug 设为可选,这没有多大意义,但没关系。
    现在您要检查 idslug 的所有可能的正则表达式,但可能的匹配总数是无限的,因为任何数字都将匹配 id 并且任何数字都将匹配 slug,所以这是不可能的。
    我认为对于您的视图中的第一个案例,您将在数据库中查找具有 id 的对象,然后在您呈现的页面上显示有关它的详细信息。因此,在您的 setUp() 方法中,您应该创建一些模型对象,例如:

    def setUp(self):
        MyModel.objects.create(id=1)
        MyModel.objects.create(id=5)
        ...
    

    现在在您的测试中检查这些 id:

    def test_logged_user_get_details(self):
        response = self.client.get(reverse('details', args=(1,)), follow=True)    # for first object
        self.assertEqual(response.status_code, 200)
        response = self.client.get(reverse('details', args=(5,)), follow=True)    # for second object
        self.assertEqual(response.status_code, 200)
    

    同时检查一个不存在的 id:

    response = self.client.get(reverse('details', args=(2,)), follow=True)    # for object that doesn't exists
    self.assertEqual(response.status_code, 404)
    

    由于测试名称表明只有登录用户才能访问给定的网页,所以您的设置应该包含以下内容(假设您使用的是 django 的身份验证):

    self.user = User.objects.create_user('test', 'test@email.com', 'testtest')
    

    然后在每个需要登录的测试中,首先执行以下操作:

    self.client.force_login(self.user)
    

    正如您在问题中所说,您想检查所有可能的正则表达式匹配,这是不可能的,但由于某种原因,如果您想检查许多 idslug,您可以使用循环:

    for i in range(1,n):    # define n
        response = self.client.get(reverse('details', args=(i,)), follow=True)
        self.assertEqual(response.status_code, 200)
    

    对我来说,这样做毫无意义,但由于我不完全了解您的应用程序的工作原理,所以它可能对您有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2016-06-03
      • 1970-01-01
      • 2010-12-07
      • 2017-03-15
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多