如何在Django中测试URL

11

我想在Django中测试我的URL,但是遇到了错误信息。

这是我的代码:

urls.py

url(r'^create/(?P<userName>[0-9a-zA-Z-]+)/$', views.create, name='create'),

测试.py

from django.test import TestCase, Client

client = Client()


def test_create(self):
    """Test the url for "create"
    """

    response = self.client.get('/mission/create/' + str(self.userName))
    self.assertEqual(response.status_code, 200)

我会得到这个结果:

FAIL: test_create (mission.tests.MissionUrlTests)
Test the url for "create"
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/actinbox/mission/tests.py", line 122, in test_create
    self.assertEqual(response.status_code, 200)
AssertionError: 301 != 200
请帮我修改一下这里的代码。非常感谢您的帮助。
2个回答

24

如@Selcuk所说,您在URL末尾缺少斜杠。为了避免这些拼写错误,并且以防您的URL将来更改,您应该使用Django的reverse函数获取URL:

# django 1.x
from django.core.urlresolvers import reverse
# django 2.x
from django.urls import reverse

def test_create(self):
    response = self.client.get(reverse('create', args=[self.userName]))
    self.assertEqual(response.status_code, 200)

反转是最明智的选择,就像@ilse2005所说的那样。 - Aipi
4
在Django 2.0中:from django.urls import reverse 可以翻译为“从django.urls导入reverse”。 - Walter Schweitzer

9
您的URL配置要求在userName后添加斜杠(/)。由于您在测试URL中未包含它,因此Django首先返回重定向(301)到正确的URL。
请更改以下行:
response = self.client.get('/mission/create/' + str(self.userName))

为了

response = self.client.get('/mission/create/' + str(self.userName) + '/')

或者更好。
response = self.client.get('/mission/create/{0}/'.format(self.userName))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接