2017-01-18 13 views
0

У меня есть простой класс Python следующим образом (упрощенный пример) в файле example.pyPython 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) выше?

Спасибо.

ответ

0

У меня было схожие проблемы с гнездами, но они работали вокруг них с помощью mockito. Я включил фрагменты ниже - HTH:

>>> from mockito import when, unstub 
>>> from mock import Mock 
>>> import socket 
>>> mock_socket = Mock(spec=socket.socket) 
>>> attrs = { 'recv.return_value': u'this is the string returned' } 
>>> mock_socket.configure_mock(**attrs) 
>>> mock_socket.recv(1024) 
u'this is the string returned' 
>>> when(socket).socket(socket.AF_INET, socket.SOCK_STREAM).thenReturn(mock_socket) 
<mockito.invocation.AnswerSelector object at 0x7fd102fd5890> 
>>> from myapps.app1 import mysocket 
>>> rc = mysocket.RestClient() 
>>> rc.some_route() 
"u'this is the string returned'" 
>>> mock_socket.mock_calls 
[call.recv(1024), 
call.connect(('daring.cwi.nl', 50007)), 
call.sendall('Hello, world'), 
call.recv(1024), 
call.close()] 

И файл mysocket.py:

# Echo client program 
import socket 

HOST = 'daring.cwi.nl' # The remote host 
PORT = 50007    # The same port as used by the server 

class RestClient(): 
    def some_route(self): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.connect((HOST, PORT)) 
     s.sendall('Hello, world') 
     data = s.recv(1024) 
     s.close() 
     return repr(data)