gpt4 book ai didi

scala - Akka Actor 测试 : Automatic reply with a TestProbe

转载 作者:行者123 更新时间:2023-12-04 17:44:49 25 4
gpt4 key购买 nike

我正在尝试让测试探针在收到任何消息时回复确认。

我在测试中编写了以下代码,但它不起作用:

val chgtWriter = new TestProbe(system)  {

def receive: Receive = {

case m => println("receive messagereplying with ACK"); sender() ! ACK

}

}

有没有办法做到这一点。实际将消息发送到测试探针的actor 肯定在TestThread 之外的另一个线程上运行。您可以在下面看到当前制作的完整测试。
feature("The changeSetActor periodically fetch new change set following a schedule") {


scenario("A ChangeSetActor fetch new changeset from a Fetcher Actor that return a full and an empty ChangeSet"){


Given("a ChangeSetActor with a schedule of fetching a message every 10 seconds, a ChangeFetcher and a ChangeWriter")

val chgtFetcher = TestProbe()

val chgtWriter = new TestProbe(system) {

def receive: Receive = {

case m => println("receive message {} replying with ACK"); sender() ! ACK

}

}
val fromTime = Instant.now().truncatedTo(ChronoUnit.SECONDS)
val chgtActor = system.actorOf(ChangeSetActor.props(chgtWriter.ref, chgtFetcher.ref, fromTime))

When("all are started")


Then("The Change Fetcher should receive at least 3 messages from the ChangeSetActor within 40 seconds")

var changesetSNum = 1

val received = chgtFetcher.receiveWhile( 40 seconds) {

case FetchNewChangeSet(m) => {

println(s"received: FetchNewChangeSet(${m}")

if (changesetSNum == 1) {
chgtFetcher.reply(NewChangeSet(changeSet1))
changesetSNum += 1
}
else
chgtFetcher.reply(NoAvailableChangeSet)
}

}

received.size should be (3)

}

}

changeSetActor 已经过全面测试并且可以正常工作。测试挂起与 ChangeWriter。它永远不会在接收方法中接收消息。

EDIT1(跟随@Jakko anser)

Auto Pilots如下:

val probe = TestProbe()
probe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any): TestActor.AutoPilot =
msg match {
case "stop" ⇒ TestActor.NoAutoPilot
case x ⇒ **testActor.tell(x, sender)**; TestActor.KeepRunning
}
})


尽管到目前为止给出的所有解释都很清楚,但官方示例中令人困惑的是引用“testActor”。谁是这里的 testActor?那时没有该名称的变量声明。

最佳答案

您可以使用 Auto Pilots 编写测试探针的脚本.例如:

import akka.testkit._
val probe = TestProbe()
probe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any): TestActor.AutoPilot = {
println("receive messagereplying with ACK")
sender ! ACK
TestActor.KeepRunning
}
})

在上面的示例中,我们设置了一个带有自动消息处理程序 Auto Pilot 的测试探针。当探头收到消息时,自动驾驶仪将自动触发。在此示例中,自动驾驶仪将打印一条消息并回复给发件人。

处理完一条消息后,自动驾驶仪可以决定如何处理下一条传入消息。它可以设置不同的自动驾驶,重用现有的自动驾驶( TestActor.KeepRunning ),或者完全禁用自动驾驶( TestActor.NoAutoPilot )。在此示例中,将使用相同的自动 bootstrap 来处理所有传入消息。

即使自动驾驶仪连接到探针,您仍然可以照常使用测试探针断言。
testActor在官方文档中是指您正在编写测试的 Actor 。例如,在您的情况下, Actor 可能是 ChangeSetActor分配给值 chgtActor .由于您真正想要做的只是从探针回复发送方,因此测试探针自动驾驶仪回复发送方就足够了,而不必关心 testActor .

关于scala - Akka Actor 测试 : Automatic reply with a TestProbe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com