Skip to main content

冻结日期:将 datetime.now 冻结在已知值以进行测试

项目描述

当您的测试运行时,冻结日期会暂停时间。

Frozendate 模拟datetime.datetimedatetime.date以在测试时提供已知时间。

用法

import frozendate

with frozendate.freeze(1999, 1, 1):
    party_like_its_1999()

# freeze relative freezes time relative to the current date...
with freeze_relative(days=-1):
    assert all_my_troubles_seemed_so_far_away()

with freeze(1999, 12, 31):
    # ...or relative to the previous freeze
    with freeze_relative(days=1):
        print "happy new year!"

通常,当您使用 freeze 时,时间实际上并没有停止——它只是从您指定的固定点重新开始,例如:

>>> import frozendate
>>> import datetime
>>> with frozendate.freeze(2000, 1, 1):
...     print datetime.now().replace(microsecond=0)
...     time.sleep(1)
...     print datetime.now().replace(microsecond=0)
...
2000-01-01 00:00:00
2000-01-01 00:00:01

但是如果你通过hard=True ,你总是可以得到相同的值:

>>> with frozendate.freeze(2000, 1, 1, hard=True):
...     print datetime.now().replace(microsecond=0)
...     time.sleep(1)
...     print datetime.now().replace(microsecond=0)
...
2000-01-01 00:00:00
2000-01-01 00:00:00

除了上下文管理器,还有常规的补丁和取消补丁功能。这些在测试用例设置/拆卸方法中很有用:

def setUp(self):
    frozendate.patch(2000, 1, 1)

def tearDown(self):
    frozendate.unpatch()

当您调用 freeze 或 patch 时,它会冻结 sys.modules中找到的所有模块的时间。有时您想限制为几个命名模块:

frozendate.freeze(modules=['mypackage.mymodule'])

或者修补所有内容,但排除一些仍然需要实际日期时间的模块:

frozendate.freeze(dontpatch=['somemodule', 'someotherpackage'])

0.1.3(2018-10-10 发布)

  • 与 dateutil 一起使用时修复异常

  • 添加对 Python 3.7 的支持

  • 放弃对 Python 2.6 的支持

版本 0.1.2

  • 添加对冻结 datetime.utcnow() 的支持

版本 0.1.1

  • 修复了与六个一起使用时的 ImportErrors

0.1版

  • 初始发行

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

freezedate-0.1.3.tar.gz (5.2 kB 查看哈希)

已上传 source

内置分布

freezedate-0.1.3-py3-none-any.whl (6.0 kB 查看哈希)

已上传 py3