首页 > 解决方案 > 不调用模拟方法 socket.accept()

问题描述

我正在尝试模拟套接字的服务器端。这个例子不起作用,我不知道为什么(它仍然使用原始的 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

标签: pythonsocketsmockingserver-side

解决方案


对您当前的代码进行一些非常小的更改即可:

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')

推荐阅读