mock
を使って、Pythonで単体テストを書くことを試みます。例えばPythonモックライブラリで基本クラスをモックする方法
私は以下のクラスがあります。
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
をそして、私は唯一のhandle
メソッドをテストしたいです。 socketserver.BaseRequestHandler
について何も想定する必要はありません。私はたとえば、handle
がという引数でrecv
を呼び出すと主張したいと思います。そんなことをモックですることは可能ですか?私。基本クラス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
モックが呼び出されないようですが。
私はあなたのヒントに従いましたが、その結果、派生クラスのメソッドもモックに置き換えられました。 –
私は現在のテストコードを質問に入れました。私はあなたの助けに感謝します。 –
@FrederickRothはあまり確かではありません。 Python 2ではうまく動作します。おそらく、メソッドがアクセスするオブジェクトの部分を嘲笑しようとしますか? – ecatmur