2013-04-19 11 views
7

Chciałbym się upewnić, że datetime.datetime.now() zwraca określoną datę/datę do celów testowych, Jak to zrobić? Próbowałem z pytest za monkeypatchJak wbudowana funkcja monkeypatch datetime.datetime.now?

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

Ale to daje mi błąd TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

Odpowiedz

9

jako błąd powie, nie można monkeypatch atrybuty wielu typów rozszerzeń wprowadzonych w C. (Inne implementacje Pythona mogą mieć inne zasady niż CPython, ale często mają podobne ograniczenia.)

Sposób, wokół tego jest stworzenie podklasy i monkeypatch klasa.

Na przykład (niesprawdzone, bo nie mam pytest poręczne ... ale działa z ręcznym monkeypatching):

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

To dobry początek, ale potem trzeba także upewnić się, że jest 'nowfunc' poprawnie związane. Oto ładne kompletne rozwiązanie dla py.test: http://stackoverflow.com/questions/20503373/how-to-monkeypatch-pythons-datetime-datetime-now-with-py-test –

1

Nie możesz, jak pokazuje błędów. Jeśli musisz to zrobić, musisz zmienić testowany kod, aby miał on funkcję narzędzia, która wywołuje datetime.datetime.now(), i zamiast tego zmień wszystkie odniesienia, aby wskazywały tę funkcję. Następnie możesz monkeypatch funkcji, aby zwrócić czas swojego wyboru.

Powiązane problemy