为testProbe提供ActorPath

Rad*_*ian 11 testing scala akka

我有一些代码使用它的ActorPath而不是ActorRef向actor发送消息

system.actorSelection("/user/myActor") ! "a message"
Run Code Online (Sandbox Code Playgroud)

我需要确保此消息确实已发送.因此,我需要在我的测试中创建一个存在于此actor路径中的testProbe(或类似的东西),以便它接收这些消息.

val probe = TestProbe()
val system.actorOf(probe.ref, "myActor") // ??? I want to give my probe name and path
Run Code Online (Sandbox Code Playgroud)

Rad*_*ian 7

我想出了一个不优雅的解决方案.
我定义了一个名为"ForwardActor"的助手actor

class ForwardActor(to: ActorRef) extends Actor {
    def receive = {
        case x => to.forward(x)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的测试用例中

 val probe = TestProbe() 
 val system.actorOf(Props(new ForwardActor(probe.ref)), "myActor")
 probe.expectMsg(...)
Run Code Online (Sandbox Code Playgroud)


Rol*_*uhn 6

硬编码演员路径可能会让你后来不高兴,因此你应该把它作为设计提示进行测试.我建议使用ActorRef作为第一选择,并且只有当不能使其工作时才回退到ActorPath,但是通过告诉actor使用哪个路径(在消息中或通过构造函数)来保持灵活性.