web-dev-qa-db-fra.com

Django: tester si la page a été redirigée vers l'url souhaitée

Dans mon Django, j'ai un système d'authentification. Donc, si je ne me connecte pas et n'essaie pas d'accéder aux informations personnelles d'un profil, je suis redirigé vers une page de connexion.

Maintenant, je dois écrire un scénario de test pour cela. Les réponses des navigateurs que je reçois sont:

GET /myprofile/data/some_id/ HTTP/1.1 302 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 301 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 200 6533

Comment écrire mon test? Voici ce que j'ai jusqu'à présent:

self.client.login(user="user", password="passwd")
response = self.client.get('/myprofile/data/some_id/')
self.assertEqual(response.status,200)
self.client.logout()
response = self.client.get('/myprofile/data/some_id/')

que pourrait-il arriver ensuite?

57
Deepankar Bajpeyi

Django 1.4:

https://docs.djangoproject.com/en/1.4/topics/testing/#Django.test.TestCase.assertRedirects

Django 2.0:

https://docs.djangoproject.com/en/2.0/topics/testing/tools/#Django.test.SimpleTestCase.assertRedirects

SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)

Affirme que la réponse a renvoyé un état de redirection status_code , redirigé vers URL_attendue ( y compris toutes les données [~ # ~] [[# #]] ), et que la page finale a été reçue avec target_status_code .

Si votre demande a utilisé l'argument suivi , les URL_attendue et target_status_code sera l'url et le code d'état pour le point final de la chaîne de redirection.

Si fetch_redirect_response est False , la page finale ne sera pas chargée. Étant donné que le client de test ne peut pas récupérer les URL externes, cela est particulièrement utile si URL_attendue ne fait pas partie de votre Django = app.

Le schéma est géré correctement lors des comparaisons entre deux URL. S'il n'y a aucun schéma spécifié à l'emplacement vers lequel nous sommes redirigés, le schéma de la demande d'origine est utilisé. S'il est présent, le schéma dans URL_attendue est celui utilisé pour effectuer les comparaisons avec.

110
imposeren

Vous pouvez également suivre la redirection avec:

response = self.client.get('/myprofile/data/some_id/', follow=True)

ce qui refléterait l'expérience utilisateur dans le navigateur et ferait des affirmations de ce que vous vous attendez à y trouver, telles que:

self.assertContains(response, "You must be logged in", status_code=401)
46
igniteflow

Vous pouvez vérifier response['Location'] Et voir s'il correspond à l'URL attendue. Vérifiez également que le code d'état est 302.

26
luc

response['Location'] n'existe pas en 1.9. Utilisez-le à la place:

response = self.client.get('/myprofile/data/some_id/', follow=True)
last_url, status_code = response.redirect_chain[-1]
print(last_url)
10
Alan Viars