提问人:Michal Špondr 提问时间:6/13/2019 最后编辑:Michal Špondr 更新时间:6/14/2019 访问量:245
未调用模拟方法 socket.accept()
Mocked method socket.accept() is not called
问:
我正在尝试模拟套接字的服务器端。这个例子不起作用,我不知道为什么(它仍然使用原始的socket.socket.accept()方法)。 有什么想法如何正确模拟听音插座吗?
class MySocket:
def __init__:
self.socket = socket.socket()
def listen(self):
self.socket.accept() # original socket method
class MockConn:
def recv(self, int):
return b''
def close(self):
pass
def sendall(self, str):
pass
with mock.patch('socket.socket') as mock_socket:
conn = MockConn()
mock_socket.return_value.accept.return_value = (conn, 'localhost')
s = MySocket(None)
s.listen() # this should call accept from the mock
答:
0赞
Sav
6/13/2019
#1
不确定你想要什么,但这有效:
import socket
from unittest import mock
class MySocket:
def listen(self):
print('Accept result:', socket.socket().accept())
# Accept result: (<__main__.MockConn object at 0x000001E592B36B38>, 'localhost')
class MockConn:
def recv(self, int):
return b''
def close(self):
pass
def sendall(self, str):
pass
with mock.patch('socket.socket') as mock_socket:
conn = MockConn()
mock_socket.return_value.accept.return_value = (conn, 'localhost')
s = MySocket()
s.listen()
0赞
quamrana
6/14/2019
#2
只需对当前代码进行一些非常小的更改,即可实现以下工作:
from unittest import mock
import socket
class MySocket:
def __init__(self): # init takes self
self.socket = socket.socket()
def listen(self):
return self.socket.accept() # original socket method
class MockConn:
def recv(self, int):
return b''
def close(self):
pass
def sendall(self, str):
pass
with mock.patch('socket.socket') as mock_socket:
conn = MockConn()
mock_socket.return_value.accept.return_value = (conn, 'localhost')
s = MySocket()
print(s.listen()) # this should call accept from the mock
输出:
(<__main__.MockConn object at 0x00000255C5A53B00>, 'localhost')
评论
self.socket = socket.socket(...) self.socket.accept()
socket