Как сделать monkeypatch встроенной функцией datetime.datetime.now?
Я хотел бы убедиться, что datetime.datetime.now()
возвращает конкретную дату и время для тестирования. Как мне это сделать? Я пробовал с pytest's monkeypatch
monkeypatch.setattr(datetime.datetime,"now", nowfunc)
Но это дает мне ошибку TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
2 ответа
Как говорит ошибка, вы не можете monkeypatch атрибуты многих типов расширений, реализованных в C. (Другие реализации Python могут иметь другие правила, чем CPython, но они часто имеют аналогичные ограничения.)
Способ обойти это заключается в создании подкласса и monkeypatch класса.
Например (не проверено, потому что у меня нет pytest
удобно... но работает с ручной обезьянкой):
class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime
Вы не можете, как показывает ошибка. Если вам нужно сделать это, вам нужно изменить тестируемый код, чтобы в нем была служебная функция, которая вызывает datetime.datetime.now()
и измените все ссылки так, чтобы они указывали на эту функцию. Затем вы можете установить эту функцию, чтобы вернуть время по вашему выбору.