factoryboy 不使用 freezegun
factoryboy not working with freezegun
简单模型(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_time
、date.today()
中提供假日期,但 factoryboy 不受 freezegun 的影响。它仍然给出真实的当前日期。
这是错误吗?如果是,请问 factoryboy 或 freezegun 有问题吗?
如何解决?换句话说,如何让 factoryboy 给假约会? (目前,我使用 MyModelFactory(start_date=date.today())
创建带有假日期的模型。)
freezegun 版本:0.3.9
工厂男孩版本:2.8.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
,它会在给定的时间跨度内生成随机日期。
LazyFunction(date.today)
没有解决问题,因为 date.today
在时间冻结之前被绑定(datetime.date
被 FakeDate
覆盖)。
LazyFunction(lambda: date.today())
确实解决了问题,因为它是在冻结时间后评估的。
简单模型(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_time
、date.today()
中提供假日期,但 factoryboy 不受 freezegun 的影响。它仍然给出真实的当前日期。
这是错误吗?如果是,请问 factoryboy 或 freezegun 有问题吗?
如何解决?换句话说,如何让 factoryboy 给假约会? (目前,我使用
MyModelFactory(start_date=date.today())
创建带有假日期的模型。)
freezegun 版本:0.3.9
工厂男孩版本:2.8.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
,它会在给定的时间跨度内生成随机日期。
LazyFunction(date.today)
没有解决问题,因为 date.today
在时间冻结之前被绑定(datetime.date
被 FakeDate
覆盖)。
LazyFunction(lambda: date.today())
确实解决了问题,因为它是在冻结时间后评估的。