gpt4 book ai didi

python - factoryboy 不使用 freezegun

转载 作者:行者123 更新时间:2023-11-28 17:13:34 30 4
gpt4 key购买 nike

简单模型(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()) 创建带有假日期的模型。)

冰枪版本: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这将在给定的时间跨度内生成随机日期。

关于python - factoryboy 不使用 freezegun,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718624/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com