1

我正在尝试使用 freezegun 进行单元测试:

    class Customer(models.Model):
        created_at = models.DateTimeField(default=datetime.now, null=True)


    from freezegun import freeze_time

    with freeze_time(datetime(2020, 9, 9, 9), tz_offset=9):
            customer = Customer.objects.create()
            print 'created at', customer.created_at

    # prints: created at 2020-11-27 19:54:11.994688

因此,出于某种原因,冻结时间似乎不适用于 django orm。我无法Customer.objects.create(created_at=...)在我试图测试的功能中做。

如何使用 freezegun正确设置created_at时间?

提前谢谢了。

4

1 回答 1

1

问题是您直接传递函数,因此当freezegun覆盖datetime.now属性时,对函数的引用没有影响。

另一种方法可能是制作一个自定义函数,您每次都检索该属性:

def current_time():
    return datetime.now()

class Customer(models.Model):
        created_at = models.DateTimeField(default=current_time, null=True)

但是 Django 实际上已经有了使用创建时间的方法:你可以指定auto_now_add=True[Django-doc]

class Customer(models.Model):
        created_at = models.DateTimeField(auto_now_add=True, null=True)

这还将将该字段设置为editable=False[Django-doc],这样,默认情况下,它不会显示在ModelForm.

于 2020-11-27T14:36:19.970 回答