4 votes

django test urls status code

Bonjour, je crée quelques tests pour mon projet principalement pour enrichir mes connaissances.

et j'ai quelques questions.

code de test simple :

test.py

from django.test import Client, TestCase
class User_Form_Test(TestCase):
    def test_logged_user_get_details(self):
        response = self.client.get('/details/', follow=True)
        self.assertEqual(response.status_code, 200)

    def test_logged_user_get_details_images(self):
        response = self.client.get('/details-images/', follow=True)
        self.assertEqual(response.status_code, 200)

urls.py

url(r'^details/(?P<id>\d+)/$', views.details, name='details'),
url(r'^details-images/(?P<slug>[^\.]+)/$', views.details_images, name='details_images')

tout ce code fonctionne bien, j'ai reçu des messages dans ces deux tests.

ma question est de savoir comment tester, comme dans cet exemple, toutes les expressions rationnelles possibles à partir des éléments suivants id dans le premier cas et dans le second slug dans le second cas, automatiser ?

2voto

Vaibhav Vishal Points 1683

Tout d'abord, utilisez path() et re_path(), je pense que url() est déprécié ou même supprimé.
En regardant votre modèle de regex, il semble que vous ayez fait id y slug optionnel, ce qui n'a pas beaucoup de sens, mais c'est bon.
Maintenant, vous voulez vérifier toutes les regex possibles pour id y slug mais le total des correspondances possibles est infini car n'importe quel nombre peut correspondre. id et tout correspondra slug donc ce n'est pas possible.
Je pense que pour votre premier cas, dans vos vues, vous allez chercher un objet avec ce id dans votre base de données, puis d'en afficher les détails sur la page que vous rendez. Par conséquent, dans votre méthode setUp(), vous devez créer quelques objets de vos modèles, par exemple :

def setUp(self):
    MyModel.objects.create(id=1)
    MyModel.objects.create(id=5)
    ...

Maintenant, dans votre test, vérifiez ces identifiants :

def test_logged_user_get_details(self):
    response = self.client.get(reverse('details', args=(1,)), follow=True)    # for first object
    self.assertEqual(response.status_code, 200)
    response = self.client.get(reverse('details', args=(5,)), follow=True)    # for second object
    self.assertEqual(response.status_code, 200)

Vérifiez également si un identifiant n'existe pas :

response = self.client.get(reverse('details', args=(2,)), follow=True)    # for object that doesn't exists
self.assertEqual(response.status_code, 404)

Puisque le nom du test suggère que seul l'utilisateur connecté peut accéder à la page web donnée, votre configuration devrait contenir ceci (en supposant que vous utilisez l'authentification de django) :

self.user = User.objects.create_user('test', 'test@email.com', 'testtest')

Ensuite, dans chaque test qui nécessite une connexion, faites d'abord ceci :

self.client.force_login(self.user)

Comme vous l'avez dit dans votre question, vous souhaitez vérifier toutes les correspondances possibles de l'expression rationnelle, ce qui n'est pas possible, mais pour une raison quelconque, si vous souhaitez vérifier plusieurs id ou slug vous pouvez utiliser une boucle :

for i in range(1,n):    # define n
    response = self.client.get(reverse('details', args=(i,)), follow=True)
    self.assertEqual(response.status_code, 200)

Pour moi, faire quelque chose comme ça n'a aucun sens, mais comme je ne connais pas complètement le fonctionnement de votre application, cela pourrait vous être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X