web-dev-qa-db-fra.com

Chargement des appareils dans les tests unitaires Django

J'essaie de commencer à écrire des tests unitaires pour Django et je pose quelques questions sur les fixtures:

J'ai fait un montage de toute ma base de projet (application non certaine) et je souhaite le charger pour chaque test, car il semblerait que le fait de charger uniquement le montage pour certaines applications ne suffira pas.

J'aimerais que le projecteur soit stocké dans /proj_folder/fixtures/proj_fixture.json.

J'ai défini la FIXTURE_DIRS = ('/fixtures/',) dans mon fichier settings.py. Ensuite, dans mon cas de test, j'essaie 

fixtures = ['proj_fixture.json']

mais mes appareils ne se chargent pas. Comment peut-on résoudre ce problème? Comment ajouter un lieu pour la recherche d’appareils? En général, est-il possible de charger l’appareil pour le test_db entier pour chaque test dans chaque application (si elle est assez petite)? Merci!

35
gleb.pitsevich

Avez-vous vraiment un dossier /fixtures/ sur votre disque dur?

Vous avez probablement eu l'intention d'utiliser:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
30
Ben James

J'ai spécifié le chemin relatif à la racine du projet dans TestCase comme suit:

from Django.test import TestCase

class MyTestCase(TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]
    ...

et cela a fonctionné sans utiliser FIXTURE_DIRS

82
Evgeny

La bonne pratique consiste à utiliser la variable PROJECT_ROOT dans votre settings.py:

import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
29
Leonid Shvechikov

Au lieu de créer un dossier fixures et d'y placer des fixtures (dans chaque application), une meilleure façon de gérer cela serait de placer tous les fixtures dans un dossier au niveau du projet et de les charger.

from Django.core.management import call_command

class TestMachin(TestCase):

    def setUp(self):
        # Load fixtures
        call_command('loaddata', 'fixtures/myfixture', verbosity=0)

Invoquer call_command équivaut à exécuter:

 manage.py loaddata /path/to/fixtures 
9
Armance

Je l'ai fait et je n'avais pas à donner de référence de chemin, le nom du fichier de montage me suffisait.

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)
3
Andres

Supposons que votre nom de projet est hello_Django, il a une application nommée api. Voici les étapes pour créer des fixtures dans api:

  1. Étape facultative: créer un fichier de fixture à partir de la base de données: python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. Créer un répertoire de test: api/tests
  3. Créer un fichier vide __init__.py dans api/tests
  4. Créer un fichier test: test_fixtures.py

 Test Fixtures

  1. Exécutez le test (chargera vos fixtures dans la base de données): python manage.py test api.tests
2
Tho

Vous avez deux options, selon que vous ayez un appareil ou un ensemble de code Python pour renseigner les données.

Pour les fixtures, utilisez cls.fixtures, comme indiqué dans une réponse à cette question,

class MyTestCase(Django.test.TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]

Pour Python, utilisez cls.setUpTestData:

class MyTestCase(Django.test.TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.create_fixture()  # create_fixture is a custom function

setUpTestData est appelé par le TestCase.setUpClass.

Vous pouvez utiliser les deux, auquel cas les fixtures sont chargées en premier car setUpTestData est appelé après le chargement des fixtures.

2
Jorge Leitão

Si vous avez remplacé la méthode setUpClass, assurez-vous d'appeler la méthode super().setUpClass() en tant que première ligne de la méthode. Le code pour charger les fixtures est dans la classe TestCase. 

0
saurabheights