覆盖unittest的auto_now

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)

我必须生成具有昨天时间戳的事件(模块将汇总它们).问题是您无法覆盖时间戳.时间戳是它生成事件时的时间戳,文档非常清楚地说明了这一点.

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

  • 也许在Model类之外以不同的方式生成数据库数据.在哪里以及如何?
  • 以某种方式定义一个不同的类或更改类以在测试期间表现不同,类似于

_

 if testing:
     timestamp = models.DateTimeField(auto_now_add=True)
 else:
     timestamp = models.DateTimeField(auto_now_add=False)
Run Code Online (Sandbox Code Playgroud)

或者也许有更简单的方法来做到这一点......任何想法?

Stu*_*nes 7

处理此问题的另一种方法是在创建实例后使用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)


Khe*_*ben 2

我已经成功使用固定装置创建了覆盖默认值的数据。

我创建了一个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)

  • 赛程不规则,他们有严重的问题。使用[工厂](http://factoryboy.readthedocs.org/en/latest/orms.html) (2认同)