La fonction datetime.now() peut parfois “poser problème” dans les tests unitaires. En effet, lorsqu’on veut comparer le résultat d’une fonction comportant une date (now) à un objet pré-défini expected, cela peut poser problème…


Si on essaye de patcher la fonction today() ou now() comme ceci

@mock.patch('datetime.date.today')
def test():
    datetime.date.today.return_value = date(2010, 1, 1)
    print datetime.date.today()

cela ne fonctionnera pas car les types built-in sont immutables.

On aura alors une erreur du genre: TypeError: can't set attributes of built-in/extension type 'datetime.date'

Pour contourner ce “problème”, on peut utiliser le module freezegun.


Example:

from freezegun import freeze_time

@freeze_time("2021-02-23")
def test_my_function():

    from datetime import datetime
    print(datetime.now()) #  2021-02-23 00:00:00

    from datetime import date
    print(date.today()) #  2021-02-23