James Reid
James Reid

Reputation: 459

How to test url in django

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

Answers (2)

ilse2005
ilse2005

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

Selcuk
Selcuk

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

Related Questions