扭曲AMP测试期间的KeyError异常

时间:2015-11-16 18:58:30

标签: python python-2.7 twisted python-mock

我试图使用Twisted进行简单的集成测试,但我发现了一个我无法处理的错误。

测试的唯一目的是使用callremote进行AMP调用,expect返回true。该测试的代码是开发代码的简化,工作正常。

此行描述了AMP呼叫。

class SendMsg(amp.Command):

    arguments = [('sMsg', amp.String()),('iTimestamp', amp.Integer())]
    response = [('bResult', amp.Boolean())]
    errors = {SlotErrorNotification: 'SLOT_ERROR_NOTIFICATION'}

我还在一个名为SATNETServer的类中描述了该协议

class SATNETServer(amp.AMP):

    def vSendMsg(self, sMsg, iTimestamp):
        return {'bResult': True}
    SendMsg.responder(vSendMsg)

为了建立沟通,我有一个模拟运输的对象。

class FakeTransport(object):

    def write(self, data):
        self.peer.dataReceived(data)

    def loseConnection(self):
        pass

    def getPeer(self):
        pass

    def getHost(self):
        pass

班级考试负责。

class ClientToServerTest(unittest.TestCase):

    def mock_processframe(self, AMP_self, frame):

        CONNECTION_INFO = {}
        gsi = object

        clientprotocol = ClientProtocol(CONNECTION_INFO, gsi)
        clientprotocol.callRemote = mock.MagicMock(side_effect=self.mock_callremote)
    clientprotocol._processframe(frame)


def mock_callremote(self, SendMsg, sMsg, iTimestamp):
    try:
        self.amp.callRemote(SendMsg, sMsg='hola', iTimestamp=misc.get_utc_timestamp())
    except Exception as e:
        log.err(e)

def setUp(self):       
    log.startLogging(sys.stdout)
    log.msg("")

    server = SATNETServer()
    self.amp = AMP()

    server.makeConnection(FakeTransport())
    self.amp.makeConnection(FakeTransport())

    server.transport.peer = self.amp
    self.amp.transport.peer = server

    return True

def test_AMPPresentCorrectFrame(self):
    frame = 'Frame'
    CONNECTION_INFO = {}
    GS = 'Vigo'

    self.amp._processframe = mock.MagicMock(side_effect=self.mock_processframe)

    gsi = GroundStationInterface(CONNECTION_INFO, GS, self.amp)._manageFrame(frame)

运行上述代码时出现的错误如下:

2015-11-16 18:34:57+0100 [-] Amp server or network failure unhandled by client application.  Dropping connection!  To avoid, add errbacks to ALL remote commands!
Traceback (most recent call last):
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 978, in ampBoxReceived
    self._commandReceived(box)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 957, in _commandReceived
    deferred.addCallback(self._safeEmit)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 317, in addCallback
    callbackKeywords=kw)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 306, in addCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 989, in _safeEmit
    aBox._sendTo(self.boxSender)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 642, in _sendTo
    proto.sendBox(self)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 2218, in sendBox
    self.transport.write(box.serialize())
  File "test_clientToServer.py", line 83, in write
    self.peer.dataReceived(data)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 2243, in dataReceived
    return Int16StringReceiver.dataReceived(self, data)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/basic.py", line 765, in dataReceived
    self.stringReceived(packet)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/basic.py", line 877, in stringReceived
    self.state = statehandler(string)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 2296, in proto_key
    self.boxReceiver.ampBoxReceived(self._currentBox)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 974, in ampBoxReceived
    self._answerReceived(box)
  File "/home/sgongar/Dev/generic-client/.venv_test/local/lib/python2.7/site-packages/twisted/protocols/amp.py", line 904, in _answerReceived
    question = self._outstandingRequests.pop(box[ANSWER])
exceptions.KeyError: '1'

我搜索了文档,我找不到任何可以解释可能发生的事情。我将不胜感激任何帮助。

0 个答案:

没有答案