Scala 测试使用无限流完成的akka http路由
我有一个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") {
源代码。如何使用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转换为更容易解析的实体),但这正是我想要的。