2017-01-20 30 views
0

我有一個akka-http路由,它返回一個包含無限實體流的Source。我如何測試使用路由測試工具包?我想檢查流的前n個元素,但是我已經看了一下testkit代碼,看起來好像沒有直接的方式來訪問響應中的Source。它總是被轉換爲ByteString的序列,在我的情況下,這只是導致TimeoutException,因爲流不會終止。測試完成無限流的akka​​-http路由

作爲參考,這個問題可以用路線轉載看起來像這樣:

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

什麼是'JsonSupport'? –

+0

'JsonSupport'定義爲: 對象JsonSupport延伸SprayJsonSupport與DefaultJsonProtocol { 隱VAL barFormat = jsonFormat2(BAR) } –

+0

http://doc.akka.io/docs/akka-http/current/scala/ http/routing-dsl/source-streaming-support.html ?? –

回答

0

看起來只要您所訪問的響應和testkit的邊界內的實體,它的testkit像去嘗試並充分提取它。

您可以通過RouteTestResultComponent類的私人方法awaitAllElements瞭解更多信息。

您可以嘗試簡單地使用阿卡流合併器代替。我認爲它不會讓你的測試代碼膨脹太多。示例如下:

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

// assertions 
+0

不幸的是,這不起作用 - 調用'response'阻塞,直到收到所有元素,這導致無限流的TimeoutException –

+0

你是對的,我沒有正確地檢查測試代碼。我已經修改了迴應建議的其他內容.. –

+1

這就是訣竅 - 謝謝!爲了簡潔起見,我將'RouteResult.route2HandlerFlow'改爲'Route.handlerFlow',並且由於響應的格式化(在它們自己的行上使用「,」分隔符),我不得不採用前6個元素來獲得3個序列化實體並轉換使用ByteString.utf8String轉換爲更容易解析的東西),但這正是我所期待的。 –