Django testing how to assert Redirect
I reach this question via google and I have a similar issue with testing redirect.
But my Django is v2.2 and the accepted answer cites a v1.7 which is no longer supported
I then google some more and found this code block at https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.SimpleTestCase.settings
from django.test import TestCase
class LoginTestCase(TestCase):
def test_login(self):
# First check for the default behavior
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
I modified for my own use which works.
For the OP case, this is how I believe should work if the OP uses 2.2
def test_dossier_duplicate(self) :
response = self.client.get('/dossier/3/copier/')
self.assertRedirects(response, '/mes_dossiers/')
I am leaving this here. In case future readers have a similar question but have it for Django v2.2
I've found more examples there:
Django : Testing if the page has redirected to the desired url
https://docs.djangoproject.com/en/3.0/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects
and this worked:
class Cas(TestCase):
def setUp(self):
call_command('loaddata', 'fixture_users.json', verbosity=1)
call_command('loaddata', 'xxx_tests_xxxx.yaml',
verbosity=1)
def test_dossier_duplicate(self) :
request = self.client.get('/dossier/3/copier/', follow = True)
request.user = User.objects.get(id=3)
pk = 3
response = dossier_duplicate(request, pk)
response.client = Client()
response.client.login(username='xxxx', password='xxxxx')
self.assertRedirects(response, '/mes_dossiers/', status_code=302,
target_status_code=200, fetch_redirect_response=True)
To test redirects you should use the test client instead of RequestFactory.
The API for the RequestFactory is a slightly restricted subset of the test client API:
It only has access to the HTTP methods get(), post(), put(), delete(), head(), options(), and trace().
These methods accept all the same arguments except for follows. Since this is just a factory for producing requests, it’s up to you to handle the response.
https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#the-request-factory
Try changing self.factory.get
to self.client.get
response = self.client.get('/dossier/3/copier/', follow = True)