У меня есть следующий django тестовый сценарий, который дает мне ошибки:
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):
...
Когда я запускаю свои тесты, testA
передаст успешно, но прежде testB
запускается, я получаю следующую ошибку:
IntegrityError: column username is not unique
Ясно, что это пытается создать self.u1
перед каждым тестовым сценарием и находя, что это уже существует в Базе данных. Как я заставляю это правильно мыться после каждого тестового сценария так, чтобы последующие случаи, выполненные правильно?
setUp
и tearDown
на Unittests вызываются до и после каждого тестового случая. Определите метод tearDown
который удаляет созданного пользователя.
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 tearDown(self):
self.up1.delete()
self.u1.delete()
Я бы также посоветовал создавать профили пользователей с помощью post_save
сигнала, если вы действительно не хотите создавать профиль пользователя вручную для каждого пользователя.
Продолжение комментария по поводу удаления:
Из Django docs:
Когда Django удаляет объект, он эмулирует поведение SQL ограничение ON DELETE CASCADE - в другими словами, любые объекты, которые имели внешние ключи, указывающие на объект, который будет удаляется, будут удалены вместе с ним. вместе с ним.
В вашем случае профиль пользователя указывает на пользователя, поэтому вы должны сначала удалить пользователя, чтобы одновременно удалить профиль.
Точнее, setUp
существует с той самой целью - запускаться один раз перед каждым тестовым примером.
Обратный метод, который запускается один раз после каждого тестового примера, называется tearDown
: здесь вы удаляете self.u1
и т. Д. (Предположительно, просто вызовите self.u1.delete ()
, если у вас нет дополнительных специальных требований к очистке в дополнение к простому удалению объекта).