2016-08-19 7 views
0

テストプログラム内で、Actor(child)が終了したままで、何らかの計算の後に再び作成されないことを確認したいと思います。私のテストは、(それがTestKitサブクラスの一部である)のようになります。Identifyメッセージは、終了後にアクタ選択内のアクタを検索するのはなぜですか?

val childSelection = system.actorSelection(parent.path/"*") 
childSelection ! Identify(0) 
val child = expectMsgPF { 
    case ActorIdentity(0, Some(ref)) => ref 
} 
watch(child) 
// some computation that should end in stopping child 
expectTermiated(child) 
// some computation that should not create a new child 
childSelection ! Identify(1) 
expectMsg(ActorIdentity(1, None)) 

最後の行は、時には予想外にメッセージActorIdentity(1、いくつかの(parent.path /子名))があったと述べて、失敗しました期待されるものの代わりに受信される。これは、(expectTerminated(...)テストの結果として)Terminatedメッセージを受信した後でも、Identifyメッセージをアクター選択に送信しても必ずしもActorIdentity(...、None)応答が返されるわけではありません。

誰かがakkaフレームワークが実際に何を行い、この場合どのように動作するのかを知っていますか?あなたの助けを前もってありがとう!正常に動作するようですが、読んで(と書き込み)することは非常に複雑です

val identities = receiveWhile() { 
    case ActorIdentity(1, Some(ref)) => ref == child 
} 
if (identities.isEmpty) { 
    expectMsg(ActorIdentity(1, None)) 
} else { 
    expectNoMsg 
} 

...

+0

docs http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop –

+0

のように、アクターの正常なシャットダウンを試みましたか?子供はcontext.stop(self )。私のテストプログラムに送られたTerminatedメッセージは、その子が実際に停止していることを証明しなければなりません。しかし、子供は、たとえ停止していても、短期間にakkaプラットフォームで「目に見える」ままであるようです... – Vincent

答えて

0

はあなたので、選択は次のとおりです。

一方、私はと私のテストの最後の行を置き換えparent.path/"*"にあるparent俳優は、おそらくIdentityメッセージに応答している別の子を持っています。他の子供が何を反応しているのか把握するために、子供を止めた後にあなたが受け取る身元を確認してください。

+0

受け取った身元はまさに子供のものです...したがって、私の質問です! – Vincent

+0

子供はどのように停止していますか?問題を再現する完全なテストケースを共有できますか? – thibr

関連する問題