Mocking a formatted datetime.datetime.now()

Question:

I have this below function and tried pytesting it using mock as per the examples I found here. But unfortunately I am getting an AssertionError.

def get_print_date():
    now = datetime.datetime.now()
    return now.strftime("%d/%m/%Y %H:%M:%S")

This is my pytest code:

import datetime
from unittest.mock import MagicMock

FAKE_NOW = datetime.datetime(2022, 10, 21, 22, 22, 22)
#fake_now = FAKE_NOW.strftime("%d/%m/%Y %H:%M:%S")

@pytest.fixture()
def mock_print_date(monkeypatch):
    print_date_mock = MagicMock(wraps = datetime.datetime)
    print_date_mock.now.return_value = FAKE_NOW
    monkeypatch.setattr(datetime, "datetime", print_date_mock)

def test_get_print_date(mock_print_date):
    assert get_print_date == FAKE_NOW

I also tried using strftime to the constant (to match with the exact format of the return value of my function) which I commented too because it also output for an AssertionError. Any idea what’s wrong with it?

Asked By: SoulSeeker916

||

Answers:

From a quick look, you’re asserting a function to a datetime object, i.e. assert get_print_date == FAKE_NOW, without calling the function. Doing the latter, in addition to changing the return type of the function from string to datetime, passes the test:

import datetime
from unittest.mock import MagicMock
import pytest

def get_print_date():
    now = datetime.datetime.now()
    return now

FAKE_NOW = datetime.datetime(2022, 10, 21, 22, 22, 22)

@pytest.fixture()
def mock_print_date(monkeypatch):
    print_date_mock = MagicMock(wraps = datetime.datetime)
    print_date_mock.now.return_value = FAKE_NOW
    monkeypatch.setattr(datetime, "datetime", print_date_mock)

def test_get_print_date(mock_print_date):
    assert get_print_date() == FAKE_NOW
Answered By: PApostol
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.