Tests Django : vérifier un texte brut ou associé à l’objet testé ?

Avec les exemples c’est plus clair

a marqué ce sujet comme résolu.

Hello,

Je me doute que mon titre n’est pas très clair, mais je ne savais pas comment rester assez court sinon.

Mon soucis est relativement simple. Je fais des tests pour vérifier qu’une view ressort bien les bonnes informations. La view d’une enterprise doit afficher toutes ses adresses par exemple. Donc, dans le setup de mon test, je crée l’entreprise, et j’associe ses adresses. Dans le test en lui-même, dois-je vérifier la présence de l’adresse en tant que format brut, ou dois-je plutôt véréfier la présence de l’adresse liée à l’objet ?

Avec les exemples, ce sera plus clair :

class EnterpriseViewAdressesTestCase(TestCase):
    def setUp(self) -> None:
        self.one_address = models.Enterprise(name="Enterprise 1")
        self.one_address.save()

        self.url_one_address = reverse(ENTERPRISE_VIEW, args=[self.one_address.pk])

        self.one_address_address = models.Address(
            enterprise=self.one_address,
            text_version="address 1 of one_address",
            geolocation=Point([10, 10]),
            is_production=False,
        )

# On teste l’adresse reliée directement à l’objet Adresse
    def test_returns_one_address_text_version(self) -> None:
        response = self.client.get(self.url_one_address)
        self.assertContains(response, self.one_address_address.text_version)

# Ou alors on teste l’adresse en texte brut ?
    def test_returns_one_address_text_version(self) -> None:
        response = self.client.get(self.url_one_address)
        self.assertContains(response, "address 1 of one_address")

J’ai pour l’instant utilisé la première version, qui me semble un poil plus propre et plus évolutive. Je me dis aussi que si l’application n’enregistre pas comme il faut l’adresse, alors c’est à un autre test de le fair remarquer, non ?

Voilà, c’est la ma question, c’est un peu tout con, mais je voulais être sûr, merci :)

+0 -0

Salut,

Je te conseille d’éviter à tout prix la seconde version. La première version me paraît adéquate.

En fait, on revient toujours à savoir précisément ce que tu veux tester. Ici, ça semble être que le rendu de la vue affiche bien une adresse donnée déjà contenue en base de donnée, auquel cas vérifier que l’enregistrement est correct à assez peu de sens. Avec le code actuel de setUp, si tu testes que c’est bien enregistré, tu vas essentiellement tester que les modèles de Django fonctionnent correctement, mais ce n’est pas à toi de tester leur code.

Si tu ressens le besoin de tester ton code de test parce que tu n’es pas convaincu qu’il va effectivement mettre en place la situation que tu veux tester, c’est signe qu’il faut probablement simplifier tout ça, avec par exemple des Factory.

Salut,

Merci, c’est aussi ce que je pensais du coup. Y a quelques éléments que j’ai dû garder en texte brut, les géolocalisations, parce qu’elles passent par un formattage à un moment donné dans le rendu, mais c’est tout.

Je n’ai pas bien compris ce que tu as dit sur les Factory, mais je pense qu’il faut juste que j’aille voir la doc ,je ne sais pas bien ce que sont les Factory.

+0 -0

Je me dis aussi que si l’application n’enregistre pas comme il faut l’adresse, alors c’est à un autre test de le fair remarquer, non ?

Si c’est quelque chose d’absolument critique, ça justifie un autre test. Si ça ne l’est pas, pas besoin de se prendre la tête, je pense.

Au passage, moi non plus je ne connaissais pas l’existence des Factory et bien que j’utilise Django depuis un petit moment, je n’en ai jamais entendu parler.

Ce que j’ai trouvé de meilleur dans la doc c’est ici : https://docs.djangoproject.com/en/3.2/topics/testing/advanced/

Les Factory, ce n’est pas quelque chose fournit spécifiquement par Django. Le projet technique ZdS utilise FactoryBoy.

Une fois ta Factory écrite, cela facilite beaucoup la création d’instances de modèles à la volée pour les tests. Si tu veux une entreprise, tu fais EntrepriseFactory() et hop, tu as ce qu’il te faut. C’est aussi possible d’imaginer des choses plus complexes : rajouter des paramètres pour spécifier un nombre d’adresses par exemple. Il y a pas mal d’exemples dans le code de ZdS si tu veux jeter un œil (cherche du côté des fichiers factories.py).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte