我嘗試使用mock
在python中編寫一些單元測試。如何用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
但是模擬似乎並沒有被調用。
def test_derived():
patcher = mock.patch.object(Derived, '__bases__', (mock.Mock,))
with patcher:
patcher.is_local = True
d = Derived()
print d.foo()
的is_local
黑客有必要從試圖扭轉補丁時要調用delattr
停止mock.patch
:
我跟着你的提示,但結果是,派生類的方法也被模擬所取代。 –
如果你可能看一下,我把我當前的測試代碼放在問題中?我感謝您的幫助。 –
@FrederickRoth不太確定; Python 2對我來說工作正常。也許嘗試嘲笑方法訪問的對象的部分? – ecatmur