我正在尝试模拟datetime.now()的输出来模拟时间的流逝。这是我正在尝试做的事情:
from datetime import datetime, timedelta
from mock import Mock, patch
from other_module import some_code
tomorrow = Mock(spec=datetime)
tomorrow.now = Mock(return_value=datetime.now() + timedelta(days=1))
with patch('other_module.datetime', tomorrow):
some_code()
这样可以正常工作,除了some_code()
正在使用库croniter,它专门将datetime.datetime
类作为输入并检查它是datetime.datetime
的子类。这是我遇到的问题;虽然datetime.datetime是一个类,但我的模拟不是;它不会被issubclass
方法识别为类类型。
如何确保我的模拟对象被识别为类?
答案 0 :(得分:3)
我不熟悉croniter,但是freezegun可能会对此有所帮助 - 它会对datetime.datetime
的{{1}}实例进行补丁,因此在freezegun.api.FakeDatetime
内,任何some_code()
都应使用datetime.datetimes
的实例。根据经验,如果您使用冻枪,在尝试模拟时间的推移时,您还可以避免许多令人头疼的间歇性测试失败。
freezegun.api.FakeDatetime