питон глумиться над верхней пакетов исправлений.


Используя mock в python, пакеты верхнего уровня (такие как argparse) не могут быть исправлены напрямую - предположительно, потому что нет ссылки на патч. Одним из решений является исправление каждого отдельного вызова в пакет (например, argparse.ArgumentParser). Теоретически, если вызовы пакета были добавлены без соответствующего исправления, это приведет к случайному вызову импорта во время модульного теста.

Хотя обходной путь не так уж неудобен, было бы идеально исправить его. пакеты вроде argparse outright. mock_open, похоже, использует некоторые уловки для исправления встроенного open() с помощью __main__.open. Как это работает, и могут ли подобные махинации использоваться для исправления пакетов верхнего уровня?

1 3

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().