factoryboy不使用freezegun

Pya*_*yae 5 python django django-models factory-boy freezegun

简单模型(models.py):

from django.db import models

class MyModel(models.Model):
    start_date = models.DateField()
Run Code Online (Sandbox Code Playgroud)

简单工厂(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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当前日期是 2017-08-16,假日期是 1999-09-09。在里面freeze_timedate.today()给出假日期但工厂男孩不受冻结枪的影响。它仍然给出真实的当前日期。

  • 这是bug吗?如果是,那是 factoryboy 还是 freezegun 的错误?

  • 如何解决这个问题?换句话说,如何让工厂男孩给出假日期?(目前,我使用MyModelFactory(start_date=date.today())假日期创建模型。)

冷冻枪版本:0.3.9

工厂男孩版本:2.8.1

小智 5

问题是date.today()当 python 解析工厂声明时会评估它;而factory_boy只接收结果日期实例。

\n\n

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

\n\n

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

\n\n
class MyModelFactory(factory.django.DjangoModelFactory):\n    class Meta:\n        model = MyModel\n\n    # Note that we simply pass a callable.\n    start_date = factory.LazyFunction(date.today)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n