170 похожих чатов

Народ, как мокнуть и конструктор обьекта и его метод одновременно?

У нас тестируется код, который анализирует даты, при чем одни фиксированы, другие нет. Для успешного прохождения, даты должны совпасть в диапазонах. Мокаем в тестах для модуля из другого пакета

Суть в том, что часть из дат формируется как 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

30 ответов

16 просмотров

Можно патчить объект несколько раз

Tom Cauf
Например?

Вот так лучше будет даже with patch('someclass') as foo: foo.__init__ = mock foo.somemethod = mock foo().somemethod()

В мок можешь любую функцию кидать

Tom-Cauf Автор вопроса
Yegor 𓃰
Вот так лучше будет даже with patch('someclass') ...

foo.__init__ = mock Здесь не сработает. Я так уже пробовал - выхватил исключение

Tom Cauf
foo.__init__ = mock Здесь не сработает. Я так уже...

Значит просто класс отнаследуй и методы переопредели для кейса

Tom-Cauf Автор вопроса
Yegor 𓃰
Значит просто класс отнаследуй и методы переопреде...

И что мне дальше с этим отнаследлванным классом делать, если в коде целевого модуля используется оригинальный date? Я эти значения не в качестве входных параметром передаю. Они сами создаются в модуле

Tom Cauf
И что мне дальше с этим отнаследлванным классом де...

То есть, у тебя используются глобальные переменные?

Tom-Cauf Автор вопроса
Tom Cauf
С чего ты сейчас сделал такой вывод?

С того что ты какие то данные не можешь переопределить в самостоятельном классе

Tom Cauf
С чего ты сейчас сделал такой вывод?

Это возможно только если ты плохо понимаешь код который тестируешь или когда есть какие то глобальные переменные, которые нельзя отрефакторить из за легаси

Tom-Cauf Автор вопроса
Yegor 𓃰
С того что ты какие то данные не можешь переопреде...

Чушь какую-то пишешь. При чем здесь вообще переопределения данных? Ты вопрос читал?

Tom Cauf
Чушь какую-то пишешь. При чем здесь вообще переопр...

Перечитал, я так понял, ты хочешь разные тесты с разными патчами в один кинуть

Tom-Cauf Автор вопроса
Yegor 𓃰
Перечитал, я так понял, ты хочешь разные тесты с р...

У меня есть функция, которая генерирует и вертит десятки экземпляров date. Это не только переменные, но и массивы и ключи словарей. Даты формируются как date.today(), так и date(). Для корректности теста нужно, что бы date() отрабатывал как конструктор даты, а date.today() как константа. Мокнуть одновременно и то и другое у меня не получается если мокаешь константу сегодня, то конструктор не работает, а мок по объекту работает только локально, его нельзя подсунуть в другой модуль.

Tom-Cauf Автор вопроса
Yegor 𓃰
Ну и да, в datetime.date нет метода init

Класс есть, инициальзация есть, а конструктора нет?

Tom Cauf
У меня есть функция, которая генерирует и вертит д...

Понял, лучше открой сорсы и посмотри как новый datetime создаётся

Tom-Cauf Автор вопроса
Yegor 𓃰
Нет, всё через __new__

Не суть, magic methods не получилось мокнуть в другом модуле

Tom Cauf
Не суть, magic methods не получилось мокнуть в др...

https://github.com/python/cpython/blob/main/Lib/datetime.py#L762

Tom-Cauf Автор вопроса
Yegor 𓃰
Да, ты

datetime - это пакет, из которого используется класс date

Tom-Cauf Автор вопроса
Yegor 𓃰
https://github.com/python/cpython/blob/main/Lib/da...

В этом случае нет принципиальной разницы между инит и Нью - ни то ни другое через patch для другого пакета не мокается

Tom-Cauf Автор вопроса
Yegor 𓃰
Трейс кидай тогда

Трейс чего? Какого варианта?

Tom Cauf
Трейс чего? Какого варианта?

Какая ошибка при моке вываливается

Tom-Cauf Автор вопроса
Yegor 𓃰
Какая ошибка при моке вываливается

Не при мойке, в при использовании - объект типа мэджикмок не может быть вычислен / сравнен с объектом datetime / timedelta

Tom Cauf
Не при мойке, в при использовании - объект типа мэ...

так ты не мок бери, а значение которое мокнутый метод возвращает

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Карта сайта