未调用模拟方法 socket.accept()

Mocked method socket.accept() is not called

提问人:Michal Špondr 提问时间:6/13/2019 最后编辑:Michal Špondr 更新时间:6/14/2019 访问量:245

问:

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

评论

0赞 Klaus D. 6/13/2019
将修补程序应用到导入到的位置,而不是从导入位置。
0赞 quamrana 6/13/2019
似乎您已经从这个答案中获取了模拟代码: stackoverflow.com/a/36889066 ,但那里的问题使用这样的套接字:self.socket = socket.socket(...) self.socket.accept()
0赞 Michal Špondr 6/13/2019
@quamrana 是的,我受到这个线程的启发,但请注意,这是一个客户端,我正在尝试编写一个服务器端。如果它有效,我不会重复这个问题。:-)
0赞 quamrana 6/13/2019
您仍然需要创建一个对象。socket
0赞 Michal Špondr 6/13/2019
@KlausD。我不明白你的意思。:-/我应该在哪里导入 mock.patch?

答:

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