Я пытаюсь протестировать некоторый код Python, который включает установку/сравнение дат, поэтому я пытаюсь использовать unittest.mock в своем тестировании (используя pytest). Текущая проблема, с которой я сталкиваюсь, заключается в том, что использование patch переопределяет все остальные методы исправленного класса (datetime.date) и поэтому вызывает другие ошибки, поскольку мой код использует другие методы класса.
Вот упрощенная версия моего кода.
< pre class="lang-py Prettyprint-override">#main.py
from datetime import date, timedelta, datetime
def date_distance_from_today(dt: str | date) -> timedelta:
if not isinstance(dt, date):
dt = datetime.strptime(dt, "%Y-%m-%d").date()
return date.today() - dt
#tests.py
from datetime import date, timedelta
from unittest.mock import patch
from mock_experiment import main
def test_normal(): # passes fine today, Jan 7
assert main.date_distance_from_today(date(2025, 1, 1)) == timedelta(6)
def test_normal_2(): # passes fine today, Jan 7
assert main.date_distance_from_today("2025-01-01") == timedelta(6)
def test_with_patch_on_date(): # exception thrown
with patch("mock_experiment.main.date") as patch_date:
patch_date.today.return_value = date(2025, 1, 2)
assert main.date_distance_from_today(date(2025, 1, 1)) == timedelta(1)
Когда я запускаю эти тесты, первые два проходят успешно, а третий получает следующее исключение:
def func1(dt: str | date) -> timedelta:
> if not isinstance(dt, date):
E TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union
Для меня это имеет смысл (хотя и не то, что я хочу), поскольку я выделил объект date и превратил его в MagicMock, и поэтому он не обрабатывается так, как я хотите в этом вызове isinstance.
Я также попробовал исправить date.today, но это также не удалось, как показано ниже:
def test_with_mock_on_today():
with patch("mock_experiment.main.date.today") as patch_today:
patch_today.return_value = date(2025, 1, 2)
assert main.distance_from_today(date(2025, 1, 1)) == timedelta(1)
Исключение
TypeError: cannot set 'today' attribute of immutable type 'datetime.date'
Подробнее здесь: https://stackoverflow.com/questions/793 ... hods-alone
Имитируйте date.today(), но оставьте другие методы даты в покое ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение