django test urls状态码

时间:2018-01-03 00:59:02

标签: python django testing

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

我有一些问题。

简单的测试代码:

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

1 个答案:

答案 0 :(得分:2)

首先使用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)

对我来说,做这样的事情没有任何意义,但是由于我不完全了解您的应用程序的工作方式,因此这可能对您有用。