питон глумиться над верхней пакетов исправлений.
Используя mock в python, пакеты верхнего уровня (такие как argparse) не могут быть исправлены напрямую - предположительно, потому что нет ссылки на патч. Одним из решений является исправление каждого отдельного вызова в пакет (например, argparse.ArgumentParser). Теоретически, если вызовы пакета были добавлены без соответствующего исправления, это приведет к случайному вызову импорта во время модульного теста.
Хотя обходной путь не так уж неудобен, было бы идеально исправить его. пакеты вроде argparse outright. mock_open, похоже, использует некоторые уловки для исправления встроенного open()
с помощью __main__.open
. Как это работает, и могут ли подобные махинации использоваться для исправления пакетов верхнего уровня?
1 ответ:
import unittest.mock as mock mock_argparse = mock.Mock() with mock.patch.dict('sys.modules', argparse=mock_argparse): import argparse print(argparse.ArgumentParser()) # <Mock name='mock.ArgumentParser()' id='140681471282448'>
Что касается исправления mock_open:
m = mock_open() with patch('__main__.open', m, create=True):
Похоже, что он создает атрибут
__main__.open
с фиктивным объектом, который затеняет встроенную версию, как если бы вы определили функциюopen()
в своем модуле. Я полагаю, что для реальных тестов вы должны исправитьmodule_x.open()
, где "module_x" - это модуль, который фактически вызываетopen()
.