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
は呼び出されなくなり、次のようになり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
ただし、モックは呼び出されないようです。