测试使用无限流

时间:2017-01-20 10:57:08

标签: scala akka-stream akka-http

我有一条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)))
      }
    }
  }
}

1 个答案:

答案 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