Scala Akka Http:如何测试探测请求

Scala Akka Http:如何测试探测请求,scala,unit-testing,akka,akka-http,Scala,Unit Testing,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 ~>

我有一个请求,其响应取决于参与者的回复。我试着用这种方式来测试它:

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
已验证,但是
回复
响应性检查是异步的。在这种情况下,测试失败

有没有办法等待回复?

一种方法(可能不是正确的或唯一的方法)是使用
自动驾驶仪。以下是一个例子:

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
来简单地运行路由,而不执行任何检查。我将此值分配给
结果
,因为我稍后需要此值来执行任何检查。然后,您可以安全地对
TestProbe
执行stubing。此时,它已收到消息,正在等待您的呼叫以验证收到的消息以及如何响应。然后,当完成此操作时,我们可以调用
check
,将显式结果(来自
runRoute
的结果)传递给该调用,而不是依赖隐式


如果您遵循这种方法,您应该能够使用
TestProbe
正确地测试调用参与者的路由。

谢谢。到目前为止,我试着用receive方法创建一个mock,效果很好。但我不确定它是否能引入一些间歇测试。喜欢它!非常感谢。结果上的某种“屈服”消除了异步问题:)