2015-12-04 3 views
5

Мне интересно, каков ли канонический способ проверки того, остановился ли актер в акке. Вот пример того, как я сейчас это делаю; Я беспокоюсь, что я слишком усложняю это.akka: как проверить, что актер остановлен

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

ответ

17

Вы можете избавиться от отдельного наблюдател актера, и просто смотреть целевой актер прямо из testProbe актера:

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

См here для соответствующего раздела Документов тестирования Akka.

+0

Отлично. Я надеялся на что-то подобное. Не знаю, как я пропустил это. – Mullefa

+0

Также хотел бы добавить, когда трудно получить 'ActorRef', чтобы перейти к методу' expectTerminated() ', например. ref был создан как ребенок другого актера, я счел полезным захватить ref, который был остановлен, и выполнять проверки, например. это имя: 'val msg = testProbe.expectMsgType [Terminated]; assert (msg.actor.path.name == "myActor") ' – Mullefa

+0

Есть ли что-то не так с использованием testActor вместо testProbe? 'this watch myActor' ' myActor! MyActor.Stop' 'expectTerminated (myActor)' –

Смежные вопросы