如何在 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
的所有其他功能。
假设我有一个检查日期是今天的模块(这是一个简化的代码)
# 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
的所有其他功能。