如何通过模拟库模拟套接字对象

时间:2016-04-27 11:47:53

标签: python unit-testing mocking

如何通过mock库(在Python 3的情况下为ForEach-Object)从Python的标准库中模拟TCPSocket的{​​{1}}包装器?

这是我的包装:

socket

我想测试recv_until和recv_bytes之类的功能是否能够满足他们真正需要的功能。

1 个答案:

答案 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))