[Django]-Loading fixtures in django unit tests

32πŸ‘

βœ…

Do you really have a folder /fixtures/ on your hard disk?

You probably intended to use:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
πŸ‘€Ben James

116πŸ‘

I’ve specified path relative to project root in the TestCase like so:

from django.test import TestCase

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

and it worked without using FIXTURE_DIRS

πŸ‘€Evgeny

34πŸ‘

Good practice is using PROJECT_ROOT variable in your settings.py:

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

20πŸ‘

Instead of creating fixures folder and placing fixtures in them (in every app), a better and neater way to handle this would be to put all fixtures in one folder at the project level and load them.

from django.core.management import call_command

class TestMachin(TestCase):

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

Invoking call_command is equivalent to running :

 manage.py loaddata /path/to/fixtures 
πŸ‘€Armance

9πŸ‘

Saying you have a project named hello_django with api app.

Following are steps to create fixtures for it:

  1. Optional step: create fixture file from database: python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. Create test directory: api/tests
  3. Create empty file __init__.py in api/tests
  4. Create test file: test_fixtures.py
from django.test import TestCase

class FixturesTestCase(TestCase):
  fixtures = ['api/api/fixtures/testdata.json']
  def test_it(self):
    # implement your test here
  1. Run the test to load fixtures into the database: python manage.py test api.tests
πŸ‘€Tho

3πŸ‘

I did this and I didn’t have to give a path reference, the fixture file name was enough for me.

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)
πŸ‘€Andres

2πŸ‘

You have two options, depending on whether you have a fixture, or you have a set of Python code to populate the data.

For fixtures, use cls.fixtures, like shown in an answer to this question,

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

For Python, use cls.setUpTestData:

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

setUpTestData is called by the TestCase.setUpClass.

You can use both, in which case fixtures is loaded first because setUpTestData is called after loading the fixtures.

πŸ‘€Jorge Leitao

1πŸ‘

You need to import from django.test import TestCase and NOT from unittest import TestCase. That fixed the problem for me.

πŸ‘€Ron

0πŸ‘

If you have overridden setUpClass method, make sure you call super().setUpClass() method as the first line in the method. The code to load fixtures is in TestCase class.

πŸ‘€saurabheights

Leave a comment