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 ответов

24 просмотра

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

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
Не при мойке, в при использовании - объект типа мэ...

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта