Я пытаюсь использовать mock
для написания некоторых модульных тестов в python.
Например, у меня есть следующий класс:
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
И я хочу только протестировать метод handle
. Без необходимости ничего говорить о socketserver.BaseRequestHandler
. Например, я хочу утверждать, что handle
вызывает recv
с аргументом 1024
. Можно ли это сделать с макетом? То есть заменив базовый класс socketserver.BaseRequestHandler
макетом? Или я не согласен с этой идеей?
С ответом ecatmur (спасибо!) я сначала попробовал следующее:
patcher = patch.object(TCPHandler, '__bases__', (Mock,))
with patcher:
patcher.is_local = True
handler = TCPHandler()
handler.handle()
Но теперь handle
не называется anylonger, а dir(handler)
дает:
['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
type(handler)
дает <class 'mock.TCPHandler'>
Я понимаю, что исправление базового класса также превращает мой производный класс в макет.
Я попробовал еще одну идею:
mock = MagicMock()
TCPHandler.handle(mock)
#assertions
Однако макет, кажется, не называется.