Вы можете использовать следующий подход, основанный на решении Daniel G. У этого есть преимущество не нарушать проверку типа с помощью isinstance(d, datetime.date)
.
import mock
def fixed_today(today):
from datetime import date
class FakeDateType(type):
def __instancecheck__(self, instance):
return isinstance(instance, date)
class FakeDate(date):
__metaclass__ = FakeDateType
def __new__(cls, *args, **kwargs):
return date.__new__(date, *args, **kwargs)
@staticmethod
def today():
return today
return mock.patch("datetime.date", FakeDate)
В основном мы заменяем класс на основе C datetime.date
нашим собственным подклассом python, который создает оригинальные экземпляры datetime.date
и отвечает к isinstance()
запросам точно как native datetime.date
.
Используйте его в качестве менеджера контекста в своих тестах:
with fixed_today(datetime.date(2013, 11, 22)):
# run the code under test
# note, that these type checks will not break when patch is active:
assert isinstance(datetime.date.today(), datetime.date)
Аналогичный подход может использоваться для издевательства функции datetime.datetime.now()
.