如何模拟基于 ActorSelection 的演员?
How to mock a actor based on ActorSelection?
我已经搜索了很多相关内容,但仍然没有答案。
我有一个 Actor "A" (user/A) 为另一个 actor "B" [=] 发送消息 "X" (user/B) 收到消息时 "M"。为此,演员 A 使用 ActorSelection 我需要测试当我将 M 发送到 A 时,B 将收到 "X".
我尝试在 "user/B" 上使用 TestProbe 执行此操作,但没有成功。
我也看到一些类似的问题,但每个答案都说使用 ActorRef insted of ActorSelection。这不是我的选择,我真的需要使用 ActorSelection。
有人知道吗?
简单的答案:与其在 A 中对选择的路径进行硬编码,不如使其可配置。在测试中,您可以将其指向 TestProbe 的路径。
您可以为您的测试编写简单的帮助程序,它们的名称类似于您的参与者,但会将消息转发给您的探测器。
假设这是您的设置(简化):
case object M
case object X
class A extends Actor {
def receive = {
case M => context.system.actorSelection("/user/B") ! X
}
}
您想测试演员 A
。
您可以为您的应用编写这种"test framework":
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)
那么你将能够通过简单地进行这种测试来测试 actor 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
}
我已经搜索了很多相关内容,但仍然没有答案。
我有一个 Actor "A" (user/A) 为另一个 actor "B" [=] 发送消息 "X" (user/B) 收到消息时 "M"。为此,演员 A 使用 ActorSelection 我需要测试当我将 M 发送到 A 时,B 将收到 "X".
我尝试在 "user/B" 上使用 TestProbe 执行此操作,但没有成功。
我也看到一些类似的问题,但每个答案都说使用 ActorRef insted of ActorSelection。这不是我的选择,我真的需要使用 ActorSelection。
有人知道吗?
简单的答案:与其在 A 中对选择的路径进行硬编码,不如使其可配置。在测试中,您可以将其指向 TestProbe 的路径。
您可以为您的测试编写简单的帮助程序,它们的名称类似于您的参与者,但会将消息转发给您的探测器。
假设这是您的设置(简化):
case object M
case object X
class A extends Actor {
def receive = {
case M => context.system.actorSelection("/user/B") ! X
}
}
您想测试演员 A
。
您可以为您的应用编写这种"test framework":
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)
那么你将能够通过简单地进行这种测试来测试 actor 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
}