Пользовательские значения JSONField модели базы данных, сохраняющиеся между тестами - PullRequest
0 голосов
/ 15 ноября 2018

Я использую модель базы данных Django для хранения объектов, соответствующих службе удаленных билетов.При тестировании этой модели я запускаю несколько тестов, чтобы убедиться, что сообщения журнала корректно работают для модели базы данных - я использую Django-nose для запуска этих тестов.

Модель базы данных выглядит примерно так, используя JSONField из этого ответа StackOverflow с небольшой модификацией для поддержки списков, а также диктов:

class TicketEntity(django.db.models.Model)
    tickets = JSONField(null=True, blank=True, default=[], serialize=True)
    queued_ticket_data = JSONField(null=True, blank=True, default=[], serialize=True)
    ...
    @classmethod
    def create(cls, *args, **kwargs):
        instance = cls(*args, **kwargs)
        instance.save()
        return instance

    def queue_output_for_ticket(self, log_data):
        self.queued_ticket_data += [log_data]
        self.save()

    def push_ticket(self):
        self.tickets += [self.queued_ticket_data]
        self.queued_ticket_data = []
        self.save()
        return True

Тесты (в порядке их запуска) выглядят так:

def test_ticket_entity_push_ticket(self):
    entity = TicketEntity.create()
    entity.queue_output_for_ticket("log output")
    entity.queue_output_for_ticket("more log output")
    entity.push_ticket()
    self.assertEquals(entity.tickets, [[log_data, log_data_1]])
    self.assertFalse(entity.queued_ticket_data)

 def test_ticket_entity_queue_output_for_ticket(self):
    entity = TicketEntity.create()
    log_data = "Here's some output to log.\nHere's another line of output.\nAnd another."
    entity.queue_output_for_ticket(log_data)
    self.assertEquals(entity.queued_ticket_data, [log_data])

Первый тест пройден, отлично.Второй тест не выполняется в этом утверждении assert, потому что entity.queued_ticket_data выглядит следующим образом:

["log output", 
 "more log output",
 "Here's some output to log.\nHere's another line of output.\nAnd another."]

Эти первые два элемента находятся в самом начале теста, сразу после того, как мы вызываем TicketEntity.create().Они не должны быть там - новый экземпляр должен быть чистым, потому что мы создаем его с нуля.

Аналогично, tickets также предварительно заполнен.У TicketEntity есть другие поля, которые не JSONField s, и они, кажется, не демонстрируют эту проблему.

Может кто-то пролить свет на то, почему эта проблема может происходить, и какие модификации мынужно исправить?

...