我有以下代码在测试期间设置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)