Ответ 1
Как всегда, решение тривиально: используйте django.test.TestCase
not unittest.TestCase
. И он работает во всех основных версиях Django!
По умолчанию, когда Django работает с базами данных sqlite, он создает новую в базе данных памяти для теста. Это означает, что для каждого класса, который происходит из unittest.TestCase, я получаю новую базу данных. Может ли это быть изменено так, что оно будет очищено до того, как будет запущен каждый метод тестирования?
Пример: Я тестирую класс менеджера, который обеспечивает дополнительную абстракцию поверх постоянных объектов Django. Код выглядит более-менее подобным
class TestForManager(unittest.TestCase):
def testAddingBlah(self):
manager = Manager()
self.assertEquals(manager.getBlahs(), 0)
manager.addBlah(...)
self.assertEquals(manager.getBlahs(), 1)
def testAddingBlahInDifferentWay(self):
manager = Manager()
self.assertEquals(manager.getBlahs(), 0)
manager.addBlahInDifferentWay(...)
self.assertEquals(manager.getBlahs(), 1)
Теперь первое утверждение второго теста выходит из строя, потому что состояние базы данных сохраняется между тестовыми вызовами, и в базе уже есть экземпляр Blah
.
Как всегда, решение тривиально: используйте django.test.TestCase
not unittest.TestCase
. И он работает во всех основных версиях Django!
Почему бы не сделать следующее? Это позволяет вам без существенных изменений в вашем коде.
class TestOneForManager(unittest.TestCase):
def testAddingBlah(self):
manager = Manager()
self.assertEquals(manager.getBlahs(), 0)
manager.addBlah(...)
self.assertEquals(manager.getBlahs(), 1)
class TestTwoForManager(unittest.TestCase):
def testAddingBlahInDifferentWay(self):
manager = Manager()
self.assertEquals(manager.getBlahs(), 0)
manager.addBlahInDifferentWay(...)
self.assertEquals(manager.getBlahs(), 1)
Edit. Функция "reset on TestCase" дает вам полный контроль.
Многие методы тестирования в одном TestCase хороши, когда у вас есть тестовые примеры, которые не мешают друг другу.
Несколько тестовых методов в одной тестовой камере хороши, когда у вас есть тестовые примеры, которые мешают друг другу.
Вы можете выбрать, какая модель относится к вашим тестам, группируя ваши тестовые методы в одном или нескольких тестовых примерах. У вас есть полный и полный контроль.
Вы можете использовать метод tearDown
. Он будет вызываться после запуска вашего теста. Вы можете удалить все Blahs там.