【问题标题】:factoryboy not working with freezegunfactoryboy 不使用 freezegun
【发布时间】:2018-01-24 21:29:50
【问题描述】:

简单模型(models.py):

from django.db import models

class MyModel(models.Model):
    start_date = models.DateField()

简单工厂(test_factories.py):

from datetime import date
import factory
from .models import MyModel

class MyModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = MyModel

    start_date = date.today()

manage.py shell:

In [1]: from datetime import date

In [2]: from freezegun import freeze_time

In [3]: from polls.test_factories import MyModelFactory

In [4]: date.today()
Out[4]: datetime.date(2017, 8, 16)

In [5]: with freeze_time(date(1999,9,9)):
   ...:     print(date.today())
   ...:     m = MyModelFactory()
   ...:     print(m.start_date)
   ...: 
1999-09-09
2017-08-16

当前日期是 2017-08-16,假日期是 1999-09-09。在freeze_timedate.today() 内部给出了假日期,但 factoryboy 不受冷冻枪的影响。它仍然给出真实的当前日期。

  • 这是错误吗?如果是,是 factoryboy 或 freezegun 的错误?

  • 如何解决这个问题?换句话说,如何让factoryboy给出假约会? (目前,我使用MyModelFactory(start_date=date.today()) 来创建带有假日期的模型。)

freezegun 版本:0.3.9

factoryboy 版本:2.8.1

【问题讨论】:

    标签: python django django-models factory-boy freezegun


    【解决方案1】:

    问题是date.today()在python解析工厂声明时被求值;并且 factory_boy 只接收生成的日期实例。

    这是核心 Python 行为的一部分,不能被 factory_boy 覆盖。

    此问题的正确解决方案是使用factory.LazyFunction 声明:

    class MyModelFactory(factory.django.DjangoModelFactory):
        class Meta:
            model = MyModel
    
        # Note that we simply pass a callable.
        start_date = factory.LazyFunction(date.today)
    

    您可能还想查看factory.fuzzy.FuzzyDate,它会在给定的时间跨度内生成随机日期。

    【讨论】:

      【解决方案2】:

      LazyFunction(date.today) 不能解决问题,因为 date.today 在时间冻结之前已被绑定(datetime.dateFakeDate 覆盖)。

      LazyFunction(lambda: date.today()) 确实解决了这个问题,因为它是在冻结时间之后进行评估的。

      【讨论】:

        猜你喜欢
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        相关资源
        最近更新 更多