首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用datetime.datetime.now对蟒蛇的py.test进行猴子识别?

如何用datetime.datetime.now对蟒蛇的py.test进行猴子识别?
EN

Stack Overflow用户
提问于 2013-12-10 19:20:53
回答 8查看 25.5K关注 0票数 59

我需要测试使用datetime.datetime.now()的函数。做这件事最简单的方法是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-12-10 19:20:53

您需要设置datetime.now函数。在下面的示例中,我创建了可以在以后的其他测试中重用的夹具:

代码语言:javascript
运行
复制
import datetime
import pytest

FAKE_TIME = datetime.datetime(2020, 12, 25, 17, 5, 55)

@pytest.fixture
def patch_datetime_now(monkeypatch):

    class mydatetime:
        @classmethod
        def now(cls):
            return FAKE_TIME

    monkeypatch.setattr(datetime, 'datetime', mydatetime)


def test_patch_datetime(patch_datetime_now):
    assert datetime.datetime.now() == FAKE_TIME
票数 68
EN

Stack Overflow用户

发布于 2015-01-22 03:23:15

模块

代码语言:javascript
运行
复制
from datetime import datetime
from freezegun import freeze_time # $ pip install freezegun

@freeze_time("Jan 14th, 2012")
def test_nice_datetime():
    assert datetime.now() == datetime(2012, 1, 14)

freeze_time()也可以用作上下文管理器。模块支持指定本地时区UTC偏移量。

票数 46
EN

Stack Overflow用户

发布于 2015-01-21 17:36:31

这是我用来覆盖now()但让剩下的日期时间正常工作的工具(RE: satoru的问题)。

它没有经过广泛的测试,但它确实解决了在其他上下文中使用日期时间的问题。对我来说,这对于让Django ORM使用这些日期时间值(特别是isinstance(Freeze.now(), datetime.datetime) == True)是很重要的。

代码语言:javascript
运行
复制
@pytest.fixture
def freeze(monkeypatch):
    """ Now() manager patches datetime return a fixed, settable, value
        (freezes time)
    """
    import datetime
    original = datetime.datetime

    class FreezeMeta(type):
        def __instancecheck__(self, instance):
            if type(instance) == original or type(instance) == Freeze:
                return True

    class Freeze(datetime.datetime):
        __metaclass__ = FreezeMeta

        @classmethod
        def freeze(cls, val):
            cls.frozen = val

        @classmethod
        def now(cls):
            return cls.frozen

        @classmethod
        def delta(cls, timedelta=None, **kwargs):
            """ Moves time fwd/bwd by the delta"""
            from datetime import timedelta as td
            if not timedelta:
                timedelta = td(**kwargs)
            cls.frozen += timedelta

    monkeypatch.setattr(datetime, 'datetime', Freeze)
    Freeze.freeze(original.now())
    return Freeze

也许不谈这个话题,但对于其他人来说,这个问题可能会派上用场。这个夹具允许“冻结”时间,然后在测试中随意地来回移动它:

代码语言:javascript
运行
复制
def test_timesensitive(freeze):
    freeze.freeze(2015, 1, 1)
    foo.prepare()  # Uses datetime.now() to prepare its state
    freeze.delta(days=2)
    # Does something that takes in consideration that 2 days have passed
    # i.e. datetime.now() returns a date 2 days in the future
    foo.do_something()
    assert foo.result == expected_result_after_2_days
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20503373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档