2013-04-19 2 views
7

Я хотел бы удостовериться, что datetime.datetime.now() возвращает определенное время для тестирования, как это сделать? Я попытался с monkeypatch pytest вКак функция monkeypatch встроенная функция datetime.datetime.now?

monkeypatch.setattr(datetime.datetime,"now", nowfunc) 

Но это дает мне ошибку TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

ответ

9

Как ошибка говорит вам, вы не можете monkeypatch атрибуты многих типов расширений, реализованных в С (Другие реализации Python могут иметь различные правила, чем CPython, но они часто имеют аналогичные ограничения.)

То, как вокруг этого нужно создать подкласс, а monkeypatch - класс.

Например (тестировался, потому что у меня нет под рукой pytest ... но он работает с ручной monkeypatching):

class patched_datetime(datetime.datetime): pass 
monkeypatch.setattr(patched_datetime, "now", nowfunc) 
datetime.datetime = patched_datetime 
+0

Это хорошее начало, но вы также должны убедиться, что 'nowfunc' является правильно. Вот хорошее полное решение для py.test: http://stackoverflow.com/questions/20503373/how-to-monkeypatch-pythons-datetime-datetime-now-with-py-test –

1

Вы не можете, как показывает ошибки. Если вам нужно это сделать, вам нужно будет изменить тестируемый код, чтобы он имел функцию утилиты, которая вызывает datetime.datetime.now(), и вместо этого измените все ссылки, чтобы указать на эту функцию. Затем вы можете обезопасить эту функцию, чтобы вернуть время по вашему выбору.

Смежные вопросы