在测试用例之间持续存在数据库模型自定义JSONField值

时间:2018-11-15 16:26:15

标签: json django django-database django-nose

我正在使用Django数据库模型来存储与远程票务服务相对应的对象。在测试此模型时,我正在运行一些测试,以确保日志消息对于数据库模型正确运行-我正在使用Django-nose运行这些测试。

数据库模型看起来像这样,使用this StackOverflow answer中的JSONField,并做了一些小的修改以支持列表和字典:

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])

第一次测试通过,非常好。第二个测试对该断言语句失败,因为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,它们似乎没有出现此问题。

有人可以阐明为什么可能会发生此问题,以及我们需要进行何种修改才能修复?

0 个答案:

没有答案