Имитируйте date.today(), но оставьте другие методы даты в покоеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Имитируйте date.today(), но оставьте другие методы даты в покое

Сообщение 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'


Подробнее здесь: https://stackoverflow.com/questions/793 ... hods-alone
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»