У меня есть простой класс Python следующим образом (упрощенный пример) в файле example.py
Python pytest макет вопрос socket.recv
import socket
class MySocket(object):
_connection = None
def ConnectAndGetData(self, ip, port):
self._connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._connection.settimeout(10)
self._connection.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
self._connection.connect(ip, port)
data = 0
return(data)
В другом файле (test_example.py
) У меня есть модульный тест следующим образом:
from example import MySocket
import mock
class TestExample(object):
@mock.patch('example.socket.socket.connect')
def test_connect(self, mock_connect):
IP = '10.10.10.10'
port = '5000'
my_socket = MySocket()
data = my_socket.ConnectAndGetData(IP, port)
mock_connect.assert_called_with(IP, port)
Это нормально работает (connect
). Тем не менее, теперь я добавить метод recv
к example.py
import socket
class MySocket(object):
_connection = None
def ConnectAndGetData(self, ip, port):
self._connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._connection.settimeout(10)
self._connection.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
self._connection.connect(ip, port)
data = self._connection.recv(5)
return(data)
и соответствующий код тест на test_example.py
from example import MySocket
import mock
class TestExample(object):
@mock.patch('example.socket.socket.recv')
@mock.patch('example.socket.socket.connect')
def test_connect(self, mock_connect, mock_recv):
IP = '10.10.10.10'
port = '5000'
mock_recv.side_effect = ["he", "llo"]
my_socket = MySocket()
data = my_socket.ConnectAndGetData(IP, port)
mock_connect.assert_called_with(IP, port)
assert data == "hello"
Теперь это терпит неудачу со следующим сообщением ...
F
self = <test_example.TestExample object at 0x032836F0>
mock_connect = <MagicMock name='connect' id='52967856'>
mock_recv = <MagicMock name='recv' id='45677456'>
@mock.patch('example.socket.socket.recv')
@mock.patch('example.socket.socket.connect')
def test_connect(self, mock_connect, mock_recv):
IP = '10.10.10.10'
port = '5000'
mock_recv.side_effect = ["he", "llo"]
my_socket = MySocket()
> data = my_socket.ConnectAndGetData(IP, port)
examples\test_example.py:14:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
examples\example.py:9: in ConnectAndGetData
self._connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # type: socket
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <socket._socketobject object at 0x033EF6C0>, family = 2, type = 1
proto = 0, _sock = <socket object, fd=508, family=2, type=1, protocol=0>
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
if _sock is None:
_sock = _realsocket(family, type, proto)
self._sock = _sock
for method in _delegate_methods:
> setattr(self, method, getattr(_sock, method))
E AttributeError: '_socketobject' object attribute 'recv' is read-only
..\..\Python27Dev\lib\socket.py:194: AttributeError
Может кто-то пролил свет на эту ошибку (AttributeError: '_socketobject' object attribute 'recv' is read-only
) выше?
Спасибо.