Ran*_*ize 4 unit-testing scala akka akka-http
我有一个请求,其响应取决于演员回复.我试图以这种方式测试它:
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))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了正确expectMsg的验证,但是reply对responseEntity检查是异步的.在这种情况下,测试失败.
有没有办法等待回复?
你使用的是正确的轨道TestProbe.关键是将运行请求的组合分开,然后将其检查(通过一步执行check)分为两个明确的步骤.首先运行它,然后对它进行任何存根TestProbe,最后进行检查.您的示例的更新代码如下所示:
val result = Get("/foo") ~> route ~> runRoute
myActor.expectMsg(ExecuteFoo())
myActor.reply(FOO)
check {
responseEntity shouldEqual toJsonEntity(RequestResult(FOO))
}(result)
Run Code Online (Sandbox Code Playgroud)
您可以看到我首先使用的runRoute是简单地运行路线而不执行任何检查.我将此值分配给result我,稍后我将需要它来执行任何检查.然后,你可以安全地对抗TestProbe.此时,它已收到消息,正在等待您的呼叫,以验证它获得了什么消息以及如何响应.然后,完成后,我们可以调用check,将显式结果(来自runRoute)发送给该调用而不是依赖于隐式.
如果您遵循这种方法,您应该能够使用a TestProbe来正确测试调用actor的路由.