我试图使用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'
我搜索了文档,我找不到任何可以解释可能发生的事情。我将不胜感激任何帮助。