Django / Factoryboy - невозможно удалить экземпляры в тесте - PullRequest
0 голосов
/ 04 апреля 2019

Я пишу тесты для приложения django и столкнулся с проблемой, когда удаленные объекты все еще существуют в тестовой базе данных после того, как якобы удалил их.

Я использую следующую фабрику

class CMSPageFactory(factory.DjangoModelFactory):

    class Meta:
        model = CMSPage

    title = factory.Faker('company')
    tenant = factory.SubFactory(TenantFactory)
    key = factory.Faker('slug')
    protected = False
    in_navigation = False
    active = True

Это тест, который я запускаю

def test_example_for_so(self):
  page = CMSPageFactory()
  page.delete()
  self.assertFalse(page)

И возникает следующая ошибка: AssertionError: <CMSPage: Fletcher LLC> is not false

Я, должно быть, упускаю что-то очень очевидное, но за свою жизнь я не могу понять, что. Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Объект был удален из базы данных, но все еще существует в памяти.Из Model delete docs :

Выдает SQL-запрос DELETE для объекта.Это только удаляет объект в базе данных;экземпляр Python все еще будет существовать и в его полях будут все еще данные.Этот метод возвращает количество удаленных объектов и словарь с количеством удалений для каждого типа объекта

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

2 голосов
/ 04 апреля 2019

Вы уверены, что page все еще существует в БД?

Вызов delete() для экземпляра модели django (который предположительно создает ваша фабрика) удалит строку базы данных, но и ваше локальное представление Python:

https://docs.djangoproject.com/en/2.1/ref/models/instances/#django.db.models.Model.delete

Выполняет SQL-запрос DELETE для объекта. Это только удаляет объект в базе данных; Экземпляр Python все еще будет существовать и все еще будет содержать данные в своих полях.

...