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