I'd like to make sure that datetime.datetime.now()
returns a specific datetime for testing purposes, How do I do this? I've tried with pytest's monkeypatch
monkeypatch.setattr(datetime.datetime,"now", nowfunc)
But this gives me the error TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
As the error tells you, you can't monkeypatch the attributes of many extension types implemented in C. (Other Python implementations may have different rules than CPython, but they often have similar restrictions.)
The way around this is to create a subclass, and monkeypatch the class.
For example (untested, because I don't have pytest
handy… but it works with manual monkeypatching):
class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With