Khe*_*ben 6 python django unit-testing
我已经为数据库中的事件定义了一些时间戳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)
Run Code Online (Sandbox Code Playgroud)
为了测试模块,我在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()
Run Code Online (Sandbox Code Playgroud)
我必须生成具有昨天时间戳的事件(模块将汇总它们).问题是您无法覆盖时间戳.时间戳是它生成事件时的时间戳,文档非常清楚地说明了这一点.
那么,如何使用合适的时间戳生成测试数据呢?我有几个想法:
_
if testing:
timestamp = models.DateTimeField(auto_now_add=True)
else:
timestamp = models.DateTimeField(auto_now_add=False)
Run Code Online (Sandbox Code Playgroud)
或者也许有更简单的方法来做到这一点......任何想法?
处理此问题的另一种方法是在创建实例后使用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)
Run Code Online (Sandbox Code Playgroud)
我已经成功使用固定装置创建了覆盖默认值的数据。
我创建了一个test_data.json包含以下格式数据的文件:
[
{
"model": "stats_agg.newevent",
"pk": 1,
"fields": {
"name": "event1",
"quantity":0.0,
"timestamp": "2010-02-15 00:27:40"
}
},
{
"model": "stats_agg.newevent",
"pk": 2,
"fields": {
"name": "event1",
"quantity":1.0,
"timestamp": "2010-02-15 00:27:40"
}
},
...
Run Code Online (Sandbox Code Playgroud)
然后添加到测试单元
class SimpleTest(TestCase):
fixtures = ['test_data.json']
Run Code Online (Sandbox Code Playgroud)