你好我为我的项目创建了一些测试,主要是为了丰富我的知识。
我有一些问题。
简单的测试代码:
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
?
答案 0 :(得分:2)
首先使用path()和re_path(),我认为url()已被贬值,甚至被删除。
查看您的正则表达式模式似乎使id
和slug
为可选,这没有多大意义,但是没关系。
现在,您要检查id
和slug
的所有可能的正则表达式,但是总的可能匹配项是无限的,因为任何数字都将匹配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)
正如您在问题中所说,您想检查所有可能的正则表达式匹配,但这是不可能的,但是由于某些原因,如果要检查许多id
或slug
,可以使用循环:
for i in range(1,n): # define n
response = self.client.get(reverse('details', args=(i,)), follow=True)
self.assertEqual(response.status_code, 200)
对我来说,做这样的事情没有任何意义,但是由于我不完全了解您的应用程序的工作方式,因此这可能对您有用。