Reputation: 459
I would like to test my url in django but I got error message.
here are my codes:
urls.py
url(r'^create/(?P<userName>[0-9a-zA-Z-]+)/$', views.create, name='create'),
test.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)
and i would get this result:
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
Please help me with my codes here. Thank you in advance.
Upvotes: 11
Views: 22658
Reputation: 11429
As @Selcuk said, you are missing the trailing slash in the URL. In order to avoid those typos and in case your URL will change some time, you should use django's reverse function to get URLs:
# 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)
Upvotes: 24
Reputation: 59164
Your URL configuration requires a trailing slash (/) after userName
. Since you did not include it in your test URL, Django first returns a redirect (301) to the correct URL.
Change the line
response = self.client.get('/mission/create/' + str(self.userName))
to
response = self.client.get('/mission/create/' + str(self.userName) + '/')
or better
response = self.client.get('/mission/create/{0}/'.format(self.userName))
Upvotes: 9