Я пытаюсь протестировать некоторый код 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
Программы на Python
-
Anonymous
1736281593
Anonymous
Я пытаюсь протестировать некоторый код 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'
Подробнее здесь: [url]https://stackoverflow.com/questions/79336731/mock-date-today-but-leave-other-date-methods-alone[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия