Как сделать 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()и измените все ссылки так, чтобы они указывали на эту функцию. Затем вы можете установить эту функцию, чтобы вернуть время по вашему выбору.

Другие вопросы по тегам