您可以爲您的測試編寫簡單的幫助程序,這些幫助程序與您的演員一樣被命名,但將消息轉發給您的探測器。
假設這是您的設置(簡體):
case object M
case object X
class A extends Actor {
def receive = {
case M => context.system.actorSelection("/user/B") ! X
}
}
要測試的演員A
。
你可以寫這樣的「測試框架」爲你的應用程序:
object ForwardActor {
def props(to: ActorRef) = Props(new ForwardActor(to))
}
class ForwardActor(to: ActorRef) extends Actor {
override def receive = {
case x => to forward x
}
}
def mock(name: String, probe: TestProbe)(implicit system: ActorSystem): Unit =
system.actorOf(ForwardActor.props(probe.ref), name)
然後,你就可以通過簡單地做這種測試,以測試演員A
:
"A sends X to B after receiving M" in {
val probeB = TestProbe()
mock("B", probeB)
system.actorOf(Props(new A)) ! M
probeB expectMsg X
}
爲什麼你需要使用'ActorSelection'? – Ryan
在我的情況下,我在路徑「/ user/agents/*」上有很多演員,但是這些演員都是volatiI,我沒有爲所有演員「ActorRef」。 另一方面,我有一個爲「/ user/agents/*」發送消息「X」的演員「/ user/xpto」總是收到消息「M」。 我不明白爲什麼如此複雜的模擬阿卡系統上的一些演員。 –