pytest-在测试过程中伪造时间更改



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

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

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";变量内容,但关于更改日期时间模型返回的时间。

也许我需要彻底改变嘲讽的方法,我只是在分享我当前的代码。

根据@MrBeanRemen提供的另一个问题的答案,我更新了我的代码,如下所示:

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)

最新更新