Scala 测试使用无限流完成的akka http路由

Scala 测试使用无限流完成的akka http路由,scala,akka-stream,akka-http,Scala,Akka Stream,Akka Http,我有一个akka http路由,它返回一个包含无限实体流的源代码。如何使用route testkit对其进行测试?我只想检查流的前n个元素,但我已经查看了testkit代码,似乎没有直接的方法来访问响应中的源代码。它总是通过testring转换成序列,在我的例子中,这只会导致TimeoutException,因为流永远不会终止 作为参考,该问题可通过如下路径重现: case class Bar(wibble: String, wobble: String) path("stream") {

我有一个akka http路由,它返回一个包含无限实体流的
源代码。如何使用route testkit对其进行测试?我只想检查流的前n个元素,但我已经查看了testkit代码,似乎没有直接的方法来访问响应中的
源代码。它总是通过testring转换成
序列,在我的例子中,这只会导致
TimeoutException
,因为流永远不会终止

作为参考,该问题可通过如下路径重现:

case class Bar(wibble: String, wobble: String)

path("stream") {
  get {
    complete {
      import JsonSupport._
      implicit val streamingSupport = EntityStreamingSupport.json()
      Source.unfold(1) { i =>
        Thread.sleep(10)
        Some((i + 1, Bar(i.toString, (i + 1).toString)))
      }
    }
  }
}

看起来,每当您访问testkit、testkit边界内的响应和实体时,它都会尝试完全提取它

您可以在课堂上查看私有方法
等待
,了解更多信息

您可以尝试简单地使用akka streams组合器。我想这不会让你的测试代码膨胀太多。示例如下:

def firstNElements(n: Int) = Source.single(yourRequest)
  .via(RouteResult.route2HandlerFlow(route))
  .flatMapConcat(_.entity.dataBytes)
  .take(n)
  .runWith(Sink.seq)
  .futureValue

// assertions

什么是
JsonSupport
JsonSupport
被定义为:对象JsonSupport使用DefaultJsonProtocol{implicit val barFormat=jsonFormat2(Bar)}扩展了SprayJsonSupport,但这种流并不是无限流的意思。HTTP在其标准from中必须为长时间运行的请求定义超时。于是Akka http就这样做了。如果你需要一个“无限流”,那么你应该使用web-sockets。不幸的是,这不起作用-调用
response
阻塞直到所有元素都被接收,这会导致无限流的TimeoutException你是对的,我没有正确检查testkit代码。我修改了回复,提出了其他建议。这就是关键所在-谢谢!为了简洁起见,我将'RouterResult.route2HandlerFlow'更改为'Route.handlerFlow',并且由于响应的格式设置(在它们自己的行上带有“,”分隔符),我必须使用前6个元素来获得3个序列化实体(并通过TestRing.utf8String转换为更容易解析的实体),但这正是我想要的。