如何通过mock库(在Python 3的情况下为ForEach-Object
)从Python的标准库中模拟TCPSocket
的{{1}}包装器?
这是我的包装:
socket
我想测试recv_until和recv_bytes之类的功能是否能够满足他们真正需要的功能。
答案 0 :(得分:7)
可以像
一样简单import mock # or from unittest import mock
mock_socket = mock.Mock()
mock_socket.recv.return_value = data
然后使用mock_socket
您将使用真正的套接字。您还可以模拟创建套接字的任何内容,以返回类似于此处配置的模拟值,具体取决于您的需求。
对于您的情况,您可以模拟socket.socket
,以便返回可以配置其方法的内容。请注意,此示例中的mock_socket
是一个返回Socket
对象的函数,而不是Socket
对象本身。
with mock.patch('socket.socket') as mock_socket:
mock_socket.return_value.recv.return_value = some_data
t = TCPSocket()
t.connect('example.com', 12345) # t.sock is a mock object, not a Socket
self.assertEqual(t.recv_bytes(), whatever_you_expect)
t.sock.connect.assert_called_with(('example.com', 12345))