I have the following django test case that is giving me errors:
class MyTesting(unittest.TestCase):
def setUp(self):
self.u1 = User.objects.create(username='user1')
self.up1 = UserProfile.objects.create(user=self.u1)
def testA(self):
...
def testB(self):
...
When I run my tests, testA
will pass sucessfully but before testB
starts, I get the following error:
IntegrityError: column username is not unique
It's clear that it is trying to create self.u1
before each test case and finding that it already exists in the Database. How do I get it to properly clean up after each test case so that subsequent cases run correctly?
If you want django to automatically flush the test database after each test is run then you should extend
django.test.TestCase
, NOTdjango.utils.unittest.TestCase
(as you are doing currently).It's good practice to dump the database after each test so you can be extra-sure you're tests are consistent, but note that your tests will run slower with this additional overhead.
See the WARNING section in the "Writing Tests" Django Docs.
setUp
andtearDown
methods on Unittests are called before and after each test case. DefinetearDown
method which deletes the created user.I would also advise to create user profiles using
post_save
signal unless you really want to create user profile manually for each user.Follow-up on delete comment:
From Django docs:
In your case, user profile is pointing to user so you should delete the user first to delete the profile at the same time.
Precisely,
setUp
exists for the very purpose of running once before each test case.The converse method, the one that runs once after each test case, is named
tearDown
: that's where you deleteself.u1
etc (presumably by just callingself.u1.delete()
, unless you have supplementary specialized clean-up requirements in addition to just deleting the object).