2015-12-04 29 views
5

Bir aktörün akka içinde durup durmadığını test etme şeklini merak ediyorum. İşte şu an yaptığım şeye bir örnek; Endişeli olduğum için karmaşık yapıyorum.akka: Bir aktörün durdurulduğunu test etme

import akka.actor.{Terminated, Actor, Props, ActorSystem} 
import akka.testkit.TestProbe 

class MyActor extends Actor { 
    import MyActor._ 
    override def receive: Receive = { 
    case Stop => context.stop(self) 
    } 
} 

object MyActor { 
    def props = Props(new MyActor) 
    case object Stop 
} 


object MyActorSpec { 

    val system = ActorSystem() 
    val myActor = system.actorOf(MyActor.props) 
    val testProbe = TestProbe() 

    case object MyActorStopped 

    val watcher = system.actorOf(Props(new Actor { 
    context.watch(myActor) 
    override def receive: Actor.Receive = { 
     case Terminated(`myActor`) => testProbe.ref ! MyActorStopped 
    } 
    })) 

    myActor ! MyActor.Stop 
    testProbe.expectMsg(MyActorStopped) 
} 

cevap

17

Ayrı izleyici aktör kurtulmak ve sadece testProbe aktör doğrudan hedef aktör izleyebilirsiniz:

val testProbe = TestProbe() 
testProbe watch myActor 
myActor ! MyActor.Stop 
testProbe.expectTerminated(myActor) 

Akka test docs ilgili bölüm için here bakınız.

+0

Mükemmel - Böyle bir şey için umuyordum. Onu nasıl kaçırdığımı bilmiyorum Cheers. – Mullefa

+0

Ayrıca, "ActorRef" in "expectTerminated()" yöntemine geçmesi zor olduğunda, örn. ref, başka bir aktörün çocuğu olarak yaratıldı, durdurulan ref'yi yakalamak ve kontroller yapmak için yararlı buldum. adı: val msg = testProbe.expectMsgType [Sonlandırıldı]; assert (msg.actor.path.name == "myActor") – Mullefa

+0

TestProbe yerine testActor kullanmanın bir sorunu var mı? 'bu saat myActor ' ' myActor! MyActor.Stop ' 'bekliyorTerminated (myActor)' –