Here’s a method you can use that doesn’t require altering your non-test code. Just patch the default attributes of the fields you want to affect. For example–
field = User._meta.get_field('timestamp')
mock_now = lambda: datetime(2010, 1, 1)
with patch.object(field, 'default', new=mock_now):
# Your code here
You can write helper functions to make this less verbose. For example, the following code–
@contextmanager
def patch_field(cls, field_name, dt):
field = cls._meta.get_field(field_name)
mock_now = lambda: dt
with patch.object(field, 'default', new=mock_now):
yield
would let you write–
with patch_field(User, 'timestamp', dt):
# Your code here
Similarly, you can write helper context managers to patch multiple fields at once.