akka 从名称创建子执行元的TestProbe

daolsyd0  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(135)

使用akka键入:2.6.10.我的父节点生成子参与者来做一些工作,正如你在下面看到的(注意这是事件源参与者的一部分)。有没有一种方法可以在测试期间使用可能的名称来获取对内部创建的子参与者的引用?
例如,下面我们有一个在初始化时创建的子actor provider_1,我希望从外部使用此名称获取对TestProbe的引用。我不愿意为了测试而更改代码的结构方式,例如,在这里有一些引用传入ref/factory或在测试中重新构造父代,以便测试这一点,我希望避免这种情况。

def commandHandler(
    ctx: ActorContext[Command]
  ): (State, Command) => Effect[Event, State] = { (state, cmd) =>
    cmd match {
      case Init =>
         ctx.spawn(Provider(ctx.self), "provider_1")
        Effect.none
    }
  }
waxmsbnn

waxmsbnn1#

如果您使用BehaviorTestKit来测试actor,则actor将使用另一个ActorContext实现来运行。
因此,使用scalatest匹配器,下面的代码应该可以工作(请注意,akka.actor.testkit.typed.Effect在持久性方面与Effect没有什么关系):

import akka.actor.testkit.typed.Effect.Spawned

val testKit = BehaviorTestKit(behaviorUnderTest)
testKit.run(Init)
val effect = testKit.retrieveEffect : akka.actor.testkit.typed.Effect
val childActorRef =
  effect match {
    case s: Spawned if s.childName == "provider_1" => s.ref
    case _ => fail()
  }
val childInbox = testKit.childInbox(childActorRef)
testKit.run(SendMessageToYourChild("hello"))
childInbox.hasMessages shouldBe true
childInbox.receiveMessage shouldBe MessageFromParent("hello")

akka.actor.testkit.typed.scaladsl.TestInbox旨在作为异步TestProbe的同步行为测试模拟。
我不知道异步ActorTestKit有什么类似的方法,在这里实际上会产生一个子参与者。

相关问题