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!
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/',)
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
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'),)
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
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',)
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
:
python manage.py dumpdata --format=json > api/fixtures/testdata.json
api/tests
__init__.py
dans api/tests
python manage.py test api.tests
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.
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.