代码之家  ›  专栏  ›  技术社区  ›  Green Cloak Guy

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

  •  1
  • Green Cloak Guy  · 技术社区  · 6 年前

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

    数据库模型如下所示,使用 JSONField this StackOverflow answer 只需稍作修改即可支持列表和dict:

    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 有其他字段不是 J现场 s、 他们似乎没有表现出这个问题。

    有人能解释一下为什么会发生这个问题,以及我们需要做什么样的修改来解决这个问题吗?

    0 回复  |  直到 6 年前
    推荐文章