如何测试在运行时产生子演员的 Akka 演员?

use*_*759 2 testing scala akka

在我的另一个问题之后,我有一个 UDP 服务器角色,如下所示:

class Listener(addr: InetSocketAddress) extends Actor {
  import context.system
  IO(Udp) ! Udp.Bind(self, addr)

  def spawnChild(remote): ActorRef = {
    //Check if child already exist
    context.actorOf(Props[Worker])
  }

  def receive = {
    case Udp.Bound(local) =>
      context.become(ready(sender()))
  }

  def ready(socket: ActorRef): Receive = {
    case Udp.Received(data, remote) =>
      val worker = spawnChild(remote)
      worker ! data // forward data directly to child
    case Udp.Unbind  => socket ! Udp.Unbind
    case Udp.Unbound => context.stop(self)
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在根据数据发送的位置创建子演员。这样做的原因是为了保持子actor的一些内部状态。内部状态包括上次连接时间、发送的数据包总数等

我想设置 TestProbes 来测试

  • 来自 remoteA 的数据被转发到 TestProbeA
  • 来自 remoteB 的数据转发到 TestProbeB
  • 来自 remoteA 的数据不会转发到 TestProbeB

我已阅读使用多个探针部分。但是在我的情况下,负责创建子项的是父级演员。

在这种情况下,我应该如何编写规范?或者,我应该如何重构我的代码以使其对测试更友好?

Den*_*sca 5

akka 文档中有一个部分概述了可以实现的几种方法:测试父子关系

在工作中,我们已经成功地使用了从父级外部化子项制作中解释的方法。这在实践中意味着您的父actor 在初始化时(或通过消息)采用“子工厂”参数。

在测试代​​码中,您可以提供一个“假”工厂,它将返回一个测试探针而不是一个纯演员。