AttributeError: атрибут объекта «socket» «sendto» доступен только для чтения - PullRequest
0 голосов
/ 14 мая 2019

Я получаю эту ошибку: AttributeError: атрибут объекта сокета 'sendto' доступен только для чтения

Ошибка в этой строке кода

self.server.socket.sendto = mock.MagicMock ()

Я получаю эту ошибку только в Python 3, но не в Python 2. ..

Может кто-нибудь помочь мне решить эту проблему, что именно является основной причиной?

Ниже приведен полный код

Ниже приведен файл test_servers.py

import mock

import unittest2 as unittest

import servers

class TestSVPServer(unittest.TestCase):

    @mock.patch("servers.threading")
    def setUp(self, *args):
        self.address_ = ('localhost', 8080)
        self.handler = mock.MagicMock()
        self.server = servers.SVPServer(address=self.address_, handler=self.handler)

    @mock.patch("servers.time")
    def test_sendto(self, *args):
        data = "test data"
        address = ('127.0.0.1', 8080)
        time = 10
        servers.time.time.return_value = time
        self.server.socket.sendto = mock.MagicMock()

Ниже приведено содержимое другого файла files.py

import asyncore
import select
import socket
import threading
import time

class AsyncoreUDPServer(asyncore.dispatcher, object):
    BUFFER_SIZE = 4096

    def __init__(self, address, handler):
        asyncore.dispatcher.__init__(self)
        self.handler = handler
        self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.set_reuse_addr()
        self.bind(address)

    def handle_read(self):
        self.handler(*self.socket.recvfrom(self.BUFFER_SIZE))

   def writable(self):
       return False

class SVPServer(AsyncoreUDPServer):

    def __init__(self, *args, **kwargs):
        super(SVPServer, self).__init__(*args, **kwargs)
        self.last_message_sent_timestamp = 0

   def sendto(self, *args, **kwargs):
       self.last_message_sent_timestamp = time.time()
       self.socket.sendto(*args, **kwargs)
...