Проблемы с помощью модели User в django модульных тестах

У меня есть следующий 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 перед каждым тестовым сценарием и находя, что это уже существует в Базе данных. Как я заставляю это правильно мыться после каждого тестового сценария так, чтобы последующие случаи, выполненные правильно?

21
задан theycallmemorty 15 May 2010 в 14:32
поделиться

2 ответа

Методы

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 - в другими словами, любые объекты, которые имели внешние ключи, указывающие на объект, который будет удаляется, будут удалены вместе с ним. вместе с ним.

В вашем случае профиль пользователя указывает на пользователя, поэтому вы должны сначала удалить пользователя, чтобы одновременно удалить профиль.

29
ответ дан 29 November 2019 в 20:31
поделиться

Точнее, setUp существует с той самой целью - запускаться один раз перед каждым тестовым примером.

Обратный метод, который запускается один раз после каждого тестового примера, называется tearDown : здесь вы удаляете self.u1 и т. Д. (Предположительно, просто вызовите self.u1.delete () , если у вас нет дополнительных специальных требований к очистке в дополнение к простому удалению объекта).

3
ответ дан 29 November 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: