繁体   English   中英

pytest - 测试期间的假时间更改

[英]pytest - fake time changes during test

我有以下代码在测试期间设置假时间。

我想在考试期间更改时间。 也就是说,测试应该在 9:00 开始,然后像 10:00 一样继续。

from __future__ import annotations

import datetime
import logging

import pytest

LOGGER = logging.getLogger(__name__)


@pytest.fixture(params=[datetime.datetime(2020, 12, 25, 17, 5, 55)])
def patch_datetime_now(request, monkeypatch):
    class mydatetime(datetime.datetime):
        @classmethod
        def now(cls):
            return request.param

    class mydate(datetime.date):
        @classmethod
        def today(cls):
            return request.param.date()

    monkeypatch.setattr(datetime, "datetime", mydatetime)
    monkeypatch.setattr(datetime, "date", mydate)


@pytest.mark.usefixtures("patch_datetime_now")
@pytest.mark.parametrize(
    "patch_datetime_now", [(datetime.datetime(2020, 12, 9, 11, 22, 00))], indirect=True
)
def test_update_data():
    fakeTime = datetime.datetime.now()
    # Do some stuff

    # Change the fake time

    # Do some other stuff

如何在测试期间更改假时间。 'datetime' 在测试的代码中使用,因此它不是关于更改“fakeTime”变量内容,而是关于更改 datetime 模型返回的时间。

也许我需要完全更改 mocking 方法,我只是分享我当前的代码。

按照@MrBeanBremen 提供的另一个问题的回答,我更新了我的代码,如下所示:

from __future__ import annotations

import datetime
import logging

import pytest

LOGGER = logging.getLogger(__name__)


@pytest.fixture(params=[datetime.datetime(2020, 12, 25, 17, 5, 55)])
def patch_datetime_now(request, monkeypatch):
    def _delta(timedelta=None, **kwargs):
        """ Moves time fwd/bwd by the delta"""
        from datetime import timedelta as td
        if not timedelta:
            timedelta = td(**kwargs)
        request.param += timedelta

    class mydatetime(datetime.datetime):
        @classmethod
        def now(cls):
            return request.param

        @classmethod
        def delta(cls,*args,**kwargs):
            _delta(*args,**kwargs)

    class mydate(datetime.date):
        @classmethod
        def today(cls):
            return request.param.date()

        @classmethod
        def delta(cls,*args,**kwargs):
            _delta(*args,**kwargs)

    monkeypatch.setattr(datetime, "datetime", mydatetime)
    monkeypatch.setattr(datetime, "date", mydate)


@pytest.mark.usefixtures("patch_datetime_now")
@pytest.mark.parametrize(
    "patch_datetime_now", [(datetime.datetime(2020, 12, 9, 11, 22, 00))], indirect=True
)
def test_update_data():
    fakeTime = datetime.datetime.now()
    assert fakeTime ==  datetime.datetime(2020, 12, 9, 11, 22, 00)
    datetime.datetime.delta(hours=1,seconds=10)
    fakeTime = datetime.datetime.now()
    assert fakeTime ==  datetime.datetime(2020, 12, 9, 12, 22, 10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM