2016-08-19 63 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(...)測試產生)之後,將標識消息發送給演員選擇不一定會導致ActorIdentity(...,None)響應。

有沒有人知道akka框架實際上做了什麼以及它在這種情況下如何工作?在此先感謝您的幫助!

同時,我代替我的測試與最後一行:

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

這似乎很好地工作,但也是相當複雜的多讀(寫)...

+0

做你試試演員的正常關機,如文檔http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop –

+0

沒有,孩子停止使用本身context.stop(個體經營)。發送給我的測試程序的終止消息應該證明該孩子實際上已停止。但是,似乎這個孩子,即使停下來,在akka平臺上仍然「可見」很短時間... – Vincent

回答

0

既然你選擇在parent.path/"*"上,您的parent演員可能有另一個孩子正在響應Identity消息。檢查孩子停下來後接收的身份,找出其他孩子的反應。

+0

收到的身份正是孩子的身份...因此我的問題! – Vincent

+0

孩子怎麼樣了?你能分享一個完整的測試用例來重現這個問題嗎? – thibr