У нас тестируется код, который анализирует даты, при чем одни фиксированы, другие нет. Для успешного прохождения, даты должны совпасть в диапазонах. Мокаем в тестах для модуля из другого пакета
Суть в том, что часть из дат формируется как date.today(), а другая часть как date(). Если мокать только date.today(), то это делается как-то так:
with patch('pack.alfa.date') as mock_date:
mock_date.today.return_value = datetime.date(2000,10,1)
Если мокать только объект, то там можно через patch.object но только в текущем менеджере контекста, а не для другого модуля. В итоге получается, что при вызове в другом модуле
datetime.date(2000, 12, 7)
Мы получаем не объект даты, а объект мока, который не содержит данных, а только умеет возвращать константу текущей даты. А хочется, чтоб объект мог и вернуть нормальную дату при вызове конструктора, и константу при вызове date.today
Можно патчить объект несколько раз
Вот так лучше будет даже with patch('someclass') as foo: foo.__init__ = mock foo.somemethod = mock foo().somemethod()
В мок можешь любую функцию кидать
foo.__init__ = mock Здесь не сработает. Я так уже пробовал - выхватил исключение
Значит просто класс отнаследуй и методы переопредели для кейса
И что мне дальше с этим отнаследлванным классом делать, если в коде целевого модуля используется оригинальный date? Я эти значения не в качестве входных параметром передаю. Они сами создаются в модуле
То есть, у тебя используются глобальные переменные?
С чего ты сейчас сделал такой вывод?
С того что ты какие то данные не можешь переопределить в самостоятельном классе
Это возможно только если ты плохо понимаешь код который тестируешь или когда есть какие то глобальные переменные, которые нельзя отрефакторить из за легаси
Чушь какую-то пишешь. При чем здесь вообще переопределения данных? Ты вопрос читал?
Из тебя плохая Ванга
Перечитал, я так понял, ты хочешь разные тесты с разными патчами в один кинуть
Ну и да, в datetime.date нет метода init
У меня есть функция, которая генерирует и вертит десятки экземпляров date. Это не только переменные, но и массивы и ключи словарей. Даты формируются как date.today(), так и date(). Для корректности теста нужно, что бы date() отрабатывал как конструктор даты, а date.today() как константа. Мокнуть одновременно и то и другое у меня не получается если мокаешь константу сегодня, то конструктор не работает, а мок по объекту работает только локально, его нельзя подсунуть в другой модуль.
Класс есть, инициальзация есть, а конструктора нет?
Понял, лучше открой сорсы и посмотри как новый datetime создаётся
Нет, всё через __new__
Кто-то писал про datetime?
Не суть, magic methods не получилось мокнуть в другом модуле
https://github.com/python/cpython/blob/main/Lib/datetime.py#L762
datetime - это пакет, из которого используется класс date
В этом случае нет принципиальной разницы между инит и Нью - ни то ни другое через patch для другого пакета не мокается
Трейс кидай тогда
Трейс чего? Какого варианта?
Какая ошибка при моке вываливается
Не при мойке, в при использовании - объект типа мэджикмок не может быть вычислен / сравнен с объектом datetime / timedelta
так ты не мок бери, а значение которое мокнутый метод возвращает
Обсуждают сегодня