Search code examples
pythondjangodjango-tests

Django TestCase not destroying test data after tests finish running


I am currently trying to write my first Django specs for an application. However, everytime I run the tests I receive a IntegrityError: UNIQUE constraint failed: auth_user.username due to the user I created in the previous running of the test now existing in the database.

I was under the impression that TestCase encloses the test code in a database transaction so that all data created during the test is rolled back on completion? What am I doing wrong here?

from django.test import TestCase

from django.contrib.auth.models import User
from basic.models import SavedModels

# Create your tests here.
class SavedModelsTestCase(TestCase):
    User.objects.create(username="user_001",
                        password="useruser",
                        first_name="Test",
                        last_name="User",
                        email="test_user@test.com"
                        )

    user = User.objects.filter(username="user_001")
    saved_model = SavedModels.objects.create(name="Test Model",
                                             description="A model",
                                             user=user
                                            )

    def test_saved_models(self):
        saved_model = create_saved_model()
        self.assertTrue(isinstance(saved_model, SavedModels))
        self.assertEqual(saved_model.name, "Test Model")
        self.assertEqual(saved_model.description, "A model")
        self.assertEqual(saved_model.user, user)

Solution

  • it doesn't work like that, you need two functions named setup to set up the required data(it runs at the beginning of the test) you need to create your user here and tearDown(it runs at the end) to do clean up after running that test after adding those two your code will become something like this

    class SavedModelsTestCase(TestCase):
    
       def setUp(self):
           #create your user here
        def tearDown(self):
           # for any clenaup required none in your case
    
        def test_saved_models(self):
            saved_model = create_saved_model()
            self.assertTrue(isinstance(saved_model, SavedModels))
            self.assertEqual(saved_model.name, "Test Model")
            self.assertEqual(saved_model.description, "A model")
            self.assertEqual(saved_model.user, user)