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.
The preferred way to write tests in Django is using the unittest module built-in to the Python standard library. This is covered in detail in the Writing and running tests document. You can also use any other Python test framework; Django provides an API and tools for that kind of integration.
Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL, matching against path_info . Once one of the URL patterns matches, Django imports and calls the given view, which is a Python function (or a class-based view).
The test client is a Python class that acts as a dummy web browser, allowing you to test your views and interact with your Django-powered application programmatically.
Testing is vital. Without properly testing your code, you will never know if the code works as it should, now or in the future when the codebase changes.
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)
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With