我有一条akka-http路由,它返回一个包含无限实体流的Source
。如何使用路由测试工具测试?我只想检查流的前n个元素,但我已经看了一下testkit代码,看起来没有直接的方法来访问响应中的Source
。它总是转换为ByteString
s的序列,在我的情况下只会导致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)))
}
}
}
}
答案 0 :(得分:0)
看起来无论何时您访问响应和testkit边界内的实体,它都会尝试将其完全提取出来。
您可以查看RouteTestResultComponent课程中的隐私方法awaitAllElements
,以便进一步了解。
您可以尝试简单地使用akka-streams组合器。我估计它不会过多地破坏你的测试代码。示例如下:
def firstNElements(n: Int) = Source.single(yourRequest)
.via(RouteResult.route2HandlerFlow(route))
.flatMapConcat(_.entity.dataBytes)
.take(n)
.runWith(Sink.seq)
.futureValue
// assertions