Python 3.3+unittestфункция
unittest.mock.patch()
моки
Декоратор и контекстный менеджер для замены объектов в тестах на фиктивные (mock). Позволяет изолировать тестируемый код от внешних зависимостей.
Синтаксис
from unittest.mock import patch
@patch('module.ClassName')
def test(self, mock_cls): ...
with patch('module.func') as m: ...
Главная ловушка — патчить нужно там, где имя ищут, а не там, где оно определено: если тестируемый модуль сделал у себя импорт имени, подменять надо запись в этом модуле, а патч исходного модуля на него уже не подействует. Когда декораторов несколько, моки приходят в параметры снизу вверх: ближайший к функции @patch соответствует первому аргументу.
Примеры
from unittest.mock import patch
import unittest
class Tests(unittest.TestCase):
@patch('builtins.input', return_value='42')
def test_input(self, mock_input):
self.assertEqual(input(), '42')
mock_input.assert_called_once()
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности