2015-12-04 15 views
5

Zastanawiam się, jaki jest kanoniczny sposób testowania, czy aktor zatrzymał się w akka. Oto przykład tego, jak obecnie się zajmuję; Martwię się, że to komplikuję.akka: jak sprawdzić, czy aktor został zatrzymany

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) 
} 

Odpowiedz

17

można pozbyć odrębnej aktora obserwatora, i po prostu oglądać aktora docelowego bezpośrednio z testProbe aktora:

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

Zobacz here do odpowiedniej sekcji testów docs Akka.

+0

Doskonały - Miałem nadzieję na coś takiego. Nie wiem, jak to przegapiłem. Wiwaty. – Mullefa

+0

Chciałbym również dodać, gdy trudno jest uzyskać 'ActorRef' do przekazania do metody' expectTerminated() 'np. ref został stworzony jako dziecko innego aktora, uznałem za użyteczne przechwycenie ref, który został zatrzymany i sprawdzenie np. jest to nazwa: 'val msg = testProbe.expectMsgType [Terminated]; assert (msg.actor.path.name == "myActor") ' – Mullefa

+0

Czy jest coś złego w używaniu testActor zamiast testProbe? 'ten zegarek myActor' ' myActor! MyActor.Stop' 'expectTerminated (myActor)' –

Powiązane problemy