Websocket 单元测试:来自 ScalaTestRouteTest 的 WS 不执行 websocket 请求

Websocket Unit test : WS from ScalaTestRouteTest doesnt do a websocket request

我正在尝试对 websocket 进行单元测试。从 doc 开始,我应该可以使用 WS

见下面一个sscce

package com.streamingout

import akka.http.scaladsl.model.ws.TextMessage
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.PathMatchers.Rest
import akka.http.scaladsl.testkit.{ScalatestRouteTest, WSProbe}
import akka.stream.scaladsl.{Flow, Sink, Source}
import org.scalatest.{FlatSpec, Matchers}


class Test extends FlatSpec with Matchers with ScalatestRouteTest{


  //--------------- Flow ---------------
  def flow = {
    import scala.concurrent.duration._
    val source =  Source.tick(initialDelay = 0 second, interval = 1 second, tick = TextMessage("tick"))

    Flow.fromSinkAndSource(Sink.ignore, source)
  }


  //-------------- Routing ------------
  def route = {
    path("/wskt") {
      println("websocket ws")
      handleWebSocketMessages(flow)
    } ~
      path(Rest) { pathRest =>
        println("path Rest")
        getFromFile(s"webapp/$pathRest")
      }
  }


  // create a testing probe representing the client-side
  val wsClient = WSProbe()

  // WS creates a WebSocket request for testing
  WS("/wskt", wsClient.flow) ~> route ~> check {
    // check response for WS Upgrade headers
    isWebSocketUpgrade shouldEqual true

  }
}

当我 运行 测试时,我可以在我的控制台中看到 path Rest 消息,这意味着 WS 没有升级到 Websocket。

有人知道我的代码有什么问题吗?

我正在使用 akka 2.4.7

谢谢

要使上述代码正常工作,在 route 中,路径 /wkst 应该没有任何前导斜杠

def route = {
    path("wskt") {
      println("websocket ws")
      handleWebSocketMessages(flow)
    } ~
      path(Rest) { pathRest =>
        println("path Rest")
        getFromFile(s"webapp/$pathRest")
      }
  }