如何在 pytest python 中模拟补丁`today`?

how to mock patch `today` in pytest python?

假设我有一个检查日期是今天的模块(这是一个简化的代码)

# my_module.py
import datetime


def is_today(input_date):
    return input_date == datetime.date.today()

我想测试这个功能

# test_my_module.py
import datetime
from unittest.mock import patch

from my_module import is_today


def test_is_today():
    cases = [
        {'input_date': datetime.date(2022, 5, 14), 'expected_output': True, 'today': datetime.date(2022, 5, 14)},
        {'input_date': datetime.date(2022, 5, 14), 'expected_output': False, 'today': datetime.date(2022, 5, 12)}
    ]
    for case in cases:
        with patch('my_module.datetime.date.today', lambda x: case['today']):
            assert is_today(case['input_date']) == case['expected_output']

但是当我 运行 pytest test_my_module.py 时,我得到 FAILED test_my_module.py::test_is_today - TypeError: can't set attributes of built-in/extension type 'datetime.date'

知道怎么做吗?

还有人知道如何使用 pytest-mock 来完成它以及首选哪种方法吗?

您可以修补整个 datetime:

    for case in cases:
        class FakeDatetime:
            class date:
                def today(): return case['today']
        with patch('my_module.datetime', FakeDatetime)

限制是您失去了 datetime 的所有其他功能。