我们写了dateTime.dateTime和dateTime.date的覆盖(见下文)
TEST_TIME_DELTA = datetime.timedelta(seconds=0)
class TimeTravelDateTime(datetime.datetime):
@classmethod
def now(cls,*args, **kwargs):
return super(TimeTravelDateTime,cls).now(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
@classmethod
def utcnow(cls, *args, **kwargs):
return super(TimeTravelDateTime, cls).utcnow(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
@classmethod
def today(cls, *args, **kwargs):
return super(TimeTravelDateTime, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
class TimeTravelDate(datetime.date):
@classmethod
def today(cls, *args, **kwargs):
return super(TimeTravelDate, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
然后我们做了以下
sys.modules['datetime'].datetime = TimeTravelDateTime
sys.modules['datetime'].date = TimeTravelDate
但是,我们的代码现在每次尝试在DateTime中添加一个Relativedelta。
if not isinstance(other, datetime.date):
raise TypeError("unsupported type for add operation")
其他是dateTime.dateTime.today()。默认情况下,dateTime.datetime是dateTime.date的实例。另外,如果我们仅 overwrite dateTime.dateTime,则dateTime.dateTime.today()为 still dateTime.date的实例。即使type(dateTime.dateTime.today())= dateTime.dateTime
但是,随着我们对dateTime的覆盖,iSinstance检查不再通过。
如果我们仅覆盖dateTime.datetime,那么这有效
我们如何覆盖dateTime.date,以便dateTime.datetime仍然是dateTime.date的实例。IE。从这里保持子类关系https://docs.python.org/2/library/datetime.html#available-types(向下滚动一个很小的位)。
我们只是使用freezegun软件包,然后用该https://github.com/spulec/freezegun