How to test python methods that include datetime.now() for different dates?

Viewed 72

I have some methods that make use of datetime.datetime.now() from the datetime library. I want to write unit tests for those methods as if now() is several different times (for example, 5th day of the month, 15th day of the month).

For example, let's say I have this method (really just an example, I don't have a method like this)

import datetime

def days_left_this_month():
    return 30 - datetime.datetime.now().day

I'd want to test that method for the 5th day of the month ie: days_left_this_month() == 25 if now() is on the 5th day of the month.

What is the best way to do this?

1 Answers

You can use freezegun:

from freezegun import freeze_time
import datetime
import unittest


@freeze_time("2019-10-05")
def test():
    assert datetime.datetime.now() == datetime.datetime(2019, 10, 05)

For example to test days_left_this_month:

def days_left_this_month():
    return 31 - datetime.datetime.now().day

We can:

@freeze_time("2019-10-05")
def test():
    assert days_left_this_month() == 26

def test_multiple():
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y
Related