2015-12-04 164 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

+0

非常好 - 我希望有这样的事情。不知道我错过了干杯。 – Mullefa

+0

还想补充,当难以获得'ActorRef'以传递给'expectTerminated()'方法时,例如该裁判创建为另一个演员的孩子,我发现它有助于捕捉已停止的裁判,并对例如裁判进行检查。它的名字是:'valmsg = testProbe.expectMsgType [Terminated]; assert(msg.actor.path.name ==“myActor”)' – Mullefa

+0

使用testActor而不是testProbe有什么问题吗? '这只手表myActor' 'myActor! MyActor.Stop' 'expectTerminated(myActor)' –