2016-12-15 17 views
0

私は、主にサーバの応答を非同期的にテストするために使用されるクライアントを作成しようとしています。私は基本的にサーバーからの次の応答を待つ関数を作成しました。この関数が呼び出されたときにrequestIdが与えられれば、それはrequestIdで次の応答を探します。ここでは関数は次のとおりです。予期しない型エラーpython

def getNextResponse(self, requestId = None): 
    logger = logging.getLogger(__name__) 
    self.acknowledge += 1 
    logger.info("requestId ack for this response: {}".format(requestId)) 
    while(not self.response): 
     pass 
    self.acknowledge -= 1 
    logger.info("requestId unset for this response: {}".format(requestId)) 
    message = json.loads(self.messagesList[len(self.messagesList)-1]) 

    if(requestId != None): 
     while(requestId != message['body']['requestId']): 
      self.acknowledge += 1 
      while(not self.response): 
       pass  
      self.acknowledge -= 1 
      message = self.messagesList[len(self.messagesList)-1] 

    self.startMonitor -= 1  
    return message['body'] 

私も下のエンジンに送信することができ、各コマンドのヘルパー機能を持っているpingコマンドのためのヘルパー関数は言ったのいずれかです。

def ping(self, sessionId = None, requestId = None, version="1.0"): 
    result = { 
     "method": "Ping" 
     } 
    if(None != version): 
     result['version'] = version 
    if(None != sessionId): 
     result['sessionId'] = sessionId 
    if(None != requestId): 
     result['requestId'] = requestId 
    logger = logging.getLogger(__name__) 
    logger.info("Message Sent: " + json.dumps(result, indent=4)) 
    self.startMonitor += 1 
    self.ws.send(json.dumps(result)) 
    message = self.getNextResponse(requestId = requestId) 

    return message 

それは基本的に設定しますサーバが期待するすべてのパラメータを含むjsonオブジェクトで、jsonメッセージ全体をサーバに送信します。送信された後、私はgetNextResponseを呼び出してサーバーからの応答を待ちます。 requestIdはデフォルトではNoneに設定されているため、requestIdが指定されていない場合は、サーバから返される次の応答を探します。これは他の非同期コマンドのために非常に矛盾する可能性があるので、コマンドのユニークなrequestIdを提供して、サーバからの応答にこのrequestIdも含まれるようにして、各応答を一意にします。私のテストケースで

は、私が使用してランダムなrequestIdを生成しています:

def genRequestId(self): 
    x = random.randint(10000000, 99999999) 
    print x 
    reqId = str(x)+"-97a2-11e6-9346-fde5d2234523" 
    return reqId 

私は時々(ランダムのようです)ということで遭遇した問題、私は私のテストケースの一つにPINGを呼び出すときに、私はこのエラーを取得:

message = self.getNextResponse(requestId = requestId) 
TypeError: string indices must be integers, not str 

私は、このエラーによってかなり混乱しています、私がpingの内側に生成していますが、文字列と私はどのような方法で、その中に参照するわけではないことになっていることをrequestId。私はこのようなパラメータへの参照を削除しようとしました:

message = self.getNextResponse(requestId) 

しかし、私はまだこのエラーが発生しています。このエラーは、getNextResponse関数の中で深くは進まないので、呼び出すときにping関数の内側から来ていると信じています。どんな助けでも大歓迎です!

編集:ここでエラーが

トレースバック(最新の呼び出しの最後)である:test009_recTimer_Start_withAudio 応答= client.endSession(セッションIDで ファイル "ctetest./RegressionTest/WebsocketTest\test_18_RecTimer.py"、ライン385、 ENDSESSION メッセージ= self.getNextResponse(requestId)における " ient.py ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl" =セッションID、requestId = requestId_2)

ファイル、ライン528、 ファイル "ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\W 。PY」、49行は、ラッパー レイズRET TypeError例外で:

message = json.loads(self.messagesList[len(self.messagesList)-1]) 

し、さらにダウン:文字列のインデックスを使用すると、非常によく似て、あなたのコード内の二つの文を持って

+1

full stacktraceしてください! –

+0

'while(not self.response):pass'これは、あなたがロックまたは待ち行列に他のスレッドがあなたに応答を与えるのを待つように思えます。 –

答えて

0

をstrがない、整数でなければなりません。

 message = self.messagesList[len(self.messagesList)-1] 

二つ目は、私はこれがInteにないと仮定しています、文字列にmessageを割り当てるJSONオブジェクト(おそらくdict)にmessageを設定する最初のあなたのエラーの原因となっています。

+0

ありがとう、私は文字通り何十回も何度も見てきました。これは決して私に出なかった。 – Ted

関連する問題