我使用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、 他们似乎没有表现出这个问题。
有人能解释一下为什么会发生这个问题,以及我们需要做什么样的修改来解决这个问题吗?