Loading fixtures in django unit tests

DjangoUnit TestingFixtures

Django Problem Overview


I'm trying to start writing unit tests for django and I'm having some questions about fixtures:

I made a fixture of my whole project db (not certain application) and I want to load it for each test, because it looks like loading only the fixture for certain app won't be enough.

I'd like to have the fixture stored in /proj_folder/fixtures/proj_fixture.json.

I've set the FIXTURE_DIRS = ('/fixtures/',) in my settings.py. Then in my testcase I'm trying

fixtures = ['proj_fixture.json']

but my fixtures don't load. How can this be solved? How to add the place for searching fixtures? In general, is it ok to load the fixture for the whole test_db for each test in each app (if it's quite small)? Thanks!

Django Solutions


Solution 1 - Django

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

Solution 2 - Django

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'),)

Solution 3 - Django

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

You probably intended to use:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)

Solution 4 - Django

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 

Solution 5 - Django

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

Solution 6 - Django

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',)

Solution 7 - Django

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.

Solution 8 - Django

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

Solution 9 - Django

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiongleb.pitsevichView Question on Stackoverflow
Solution 1 - DjangoEvgenyView Answer on Stackoverflow
Solution 2 - DjangoLeonid ShvechikovView Answer on Stackoverflow
Solution 3 - DjangoBen JamesView Answer on Stackoverflow
Solution 4 - DjangoArmanceView Answer on Stackoverflow
Solution 5 - DjangoThoView Answer on Stackoverflow
Solution 6 - DjangoAndresView Answer on Stackoverflow
Solution 7 - DjangoJorge LeitaoView Answer on Stackoverflow
Solution 8 - DjangoRonView Answer on Stackoverflow
Solution 9 - DjangosaurabheightsView Answer on Stackoverflow