gpt4 book ai didi

python - 为单元测试覆盖 auto_now

转载 作者:太空狗 更新时间:2023-10-30 00:00:42 26 4
gpt4 key购买 nike

我已经为数据库中的事件定义了一些时间戳作为 auto_now_add,因为在存储事件的同时信息应该与它的时间戳一起存储。

事件的描述是这样的

class NewEvent(models.Model):
'''
Individual event
'''
name = models.CharField(max_length=100)
quantity = models.FloatField(null=True)
timestamp = models.DateTimeField(auto_now_add=True)

为了测试模块,我在 test.py 文件的数据库中生成一些信息,这样:

    for event in EVENT_TYPES:
time = datetime.datetime.now() - datetime.timedelta(days=1)
for i in range(48):
time = time.replace(hour=i / 2)
NewEvent(name=event,
timestamp=time,
quantity=i).save()

我必须生成带有昨天时间戳的事件(然后模块将汇总它们)。问题是您无法覆盖时间戳。时间戳是事件产生时的时间戳,documentation说得很清楚。

那么,如何为测试生成具有适当时间戳的数据呢?我有几个想法:

  • 也许可以在模型类之外以不同的方式生成数据库数据。地点和方式?
  • 以某种方式定义不同的类或更改类以在测试期间表现不同,例如

_

 if testing:
timestamp = models.DateTimeField(auto_now_add=True)
else:
timestamp = models.DateTimeField(auto_now_add=False)

或者也许有更简单的方法...有什么想法吗?

最佳答案

另一种处理方法是使用 QuerySet update在创建实例之后,根据您的用例,这可能更有用。

update 调用在 SQL 级别执行时,它将跳过验证、信号和自定义保存功能。它将需要一个可能影响性能的辅助数据库调用,因此应谨慎使用。

for event in EVENT_TYPES:
time = datetime.datetime.now() - datetime.timedelta(days=1)
for i in range(48):
time = time.replace(hour=i / 2)
instance = NewEvent(name=event, quantity=i).save()
NewEvent.objects.filter(pk=instance.pk).update(timestamp=time)

关于python - 为单元测试覆盖 auto_now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com