Переменный метод socket.accept () не вызывается - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь смоделировать серверную часть сокета.Этот пример не работает, и я не знаю почему (он все еще использует оригинальный метод 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

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

С некоторыми очень незначительными изменениями в вашем текущем коде это работает:

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')
0 голосов
/ 13 июня 2019

Не уверен, что вы хотите, но это работает:

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()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...