Tôi cố gắng sử dụng mock
để viết một số đơn vị thử nghiệm trong python.Làm thế nào để giả lập một lớp cơ sở với thư viện giả python
Ví dụ tôi có lớp sau:
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
Và tôi chỉ muốn thử nghiệm phương pháp handle
. Mà không cần phải giả định bất cứ điều gì về socketserver.BaseRequestHandler
. Ví dụ: tôi muốn xác nhận rằng handle
gọi recv
với đối số 1024
. Có thể làm điều đó với giả? I E. thay thế lớp cơ sở socketserver.BaseRequestHandler
bằng mô hình? Hay tôi theo dõi ý tưởng đó?
Với câu trả lời của ecatmur (! Cảm ơn bạn) lần đầu tiên tôi thử như sau:
patcher = patch.object(TCPHandler, '__bases__', (Mock,))
with patcher:
patcher.is_local = True
handler = TCPHandler()
handler.handle()
Nhưng bây giờ handle
không được gọi anylonger và dir(handler)
cho:
['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)
cho <class 'mock.TCPHandler'>
Tôi giải thích rằng việc vá lớp cơ sở cũng biến lớp dẫn xuất của tôi thành một mô hình.
bây giờ tôi đã ý tưởng khác thử xem:
mock = MagicMock()
TCPHandler.handle(mock)
#assertions
Tuy nhiên, mô hình có vẻ như không được gọi.
Tôi đã làm theo gợi ý của bạn nhưng hậu quả là, đó cũng là phương pháp của lớp dẫn xuất được thay thế bằng mô hình. –
Tôi đặt mã thử nghiệm hiện tại của mình trong câu hỏi, nếu bạn có thể có giao diện? Tôi đánh giá cao sự giúp đỡ của bạn. –
@FrederickRoth không quá chắc chắn; nó hoạt động tốt cho tôi với Python 2. Có lẽ thử chế nhạo các phần của đối tượng mà phương thức truy cập? – ecatmur