Akka-Http:如何测试请求
Akka-Http: How to TestProbe a request
我有一个请求,其响应取决于参与者的回复。我正在尝试以这种方式对其进行测试:
val myActor:TestProbe = TestProbe()
val route = new MyRoute() {
override def myServiceActor:ActorRef = {
myActor.ref
}
}.route
"return a query result for GET" in {
Get("/foo") ~> route ~> check {
myActor.expectMsg(ExecuteFoo())
myActor.reply(FOO)
responseEntity shouldEqual toJsonEntity(RequestResult(FOO))
}
}
我正确地知道 expectMsg
已验证,但 reply
与 responseEntity
检查是异步的。在这种情况下,测试失败。
有什么方法可以等待回复吗?
执行此操作的一种方法(可能不是正确的或唯一的方法)是使用 AutoPilot
。这是一个例子:
val myProbe = TestProbe()
myProbe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any) = msg match {
case ExecuteFoo(_) =>
//do something else if needed
sender ! FOO
TestActor.NoAutoPilot
}
})
您使用 TestProbe
的方法是正确的。关键是将 运行 请求和检查请求的组合(您正在通过 check
作为第一步执行)分成两个明确的步骤。首先 运行 它,然后对 TestProbe
进行任何存根处理,最后进行检查。您的示例的更新代码如下所示:
val result = Get("/foo") ~> route ~> runRoute
myActor.expectMsg(ExecuteFoo())
myActor.reply(FOO)
check {
responseEntity shouldEqual toJsonEntity(RequestResult(FOO))
}(result)
你可以看到我首先使用 runRoute
来简化 运行 路线而不执行任何检查。我将此值分配给 result
,因为稍后我将需要它来执行任何检查。然后,您可以安全地对 TestProbe
进行存根。此时,它已经收到消息,正在等待您的电话来验证它收到了什么消息以及如何响应。然后,完成后,我们可以调用 check
,将显式结果(来自 runRoute
的结果)传递给该调用,而不是依赖于隐式。
如果您采用这种方法,您应该能够使用 TestProbe
正确测试调用 actor 的路由。
我有一个请求,其响应取决于参与者的回复。我正在尝试以这种方式对其进行测试:
val myActor:TestProbe = TestProbe()
val route = new MyRoute() {
override def myServiceActor:ActorRef = {
myActor.ref
}
}.route
"return a query result for GET" in {
Get("/foo") ~> route ~> check {
myActor.expectMsg(ExecuteFoo())
myActor.reply(FOO)
responseEntity shouldEqual toJsonEntity(RequestResult(FOO))
}
}
我正确地知道 expectMsg
已验证,但 reply
与 responseEntity
检查是异步的。在这种情况下,测试失败。
有什么方法可以等待回复吗?
执行此操作的一种方法(可能不是正确的或唯一的方法)是使用 AutoPilot
。这是一个例子:
val myProbe = TestProbe()
myProbe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any) = msg match {
case ExecuteFoo(_) =>
//do something else if needed
sender ! FOO
TestActor.NoAutoPilot
}
})
您使用 TestProbe
的方法是正确的。关键是将 运行 请求和检查请求的组合(您正在通过 check
作为第一步执行)分成两个明确的步骤。首先 运行 它,然后对 TestProbe
进行任何存根处理,最后进行检查。您的示例的更新代码如下所示:
val result = Get("/foo") ~> route ~> runRoute
myActor.expectMsg(ExecuteFoo())
myActor.reply(FOO)
check {
responseEntity shouldEqual toJsonEntity(RequestResult(FOO))
}(result)
你可以看到我首先使用 runRoute
来简化 运行 路线而不执行任何检查。我将此值分配给 result
,因为稍后我将需要它来执行任何检查。然后,您可以安全地对 TestProbe
进行存根。此时,它已经收到消息,正在等待您的电话来验证它收到了什么消息以及如何响应。然后,完成后,我们可以调用 check
,将显式结果(来自 runRoute
的结果)传递给该调用,而不是依赖于隐式。
如果您采用这种方法,您应该能够使用 TestProbe
正确测试调用 actor 的路由。