如果我有一个如下所示的网络套接字:
def websocket: WebSocket = WebSocket.accept[String, String] { _ =>
ActorFlow.actorRef(out => LightWebSocketActor.props(out))
}
作为引用,这是 LightWebSocketActor
:
class LightWebSocketActor(out: ActorRef) extends Actor {
val topic: String = service.topic
override def receive: Receive = {
case message: String =>
play.Logger.debug(s"Message: $message")
PublishService.publish("true")
out ! message
}
}
object LightWebSocketActor {
var list: ListBuffer[ActorRef] = ListBuffer.empty[ActorRef]
def props(out: ActorRef): Props = {
list += out
Props(new LightSocketActor(out))
}
def sendMessage(message: String): Unit = {
list.foreach(_ ! message)
}
}
这是使用 akka
websocket 方法。
- 应该如何创建这种 Controller 的测试?
- 我应该如何发送信息并期待回复?
- 虚假请求中应发送哪些类型的信息?
例如,我对常规 html 返回 Controller 进行了此测试:
"Application" should {
"render the index page" in new WithApplication {
val home = route(app, FakeRequest(GET, "/")).get
status(home) must equalTo(OK)
contentType(home) must beSome.which(_ == "text/html")
contentAsString(home) must contain ("shouts out")
}
}
最佳答案
玩2.6
我按照这个例子:play-scala-websocket-example
主要步骤:
创建或提供 WebSocketClient您可以在您的
中使用
测试。
创建客户端:
val asyncHttpClient: AsyncHttpClient = wsClient.underlying[AsyncHttpClient]
val webSocketClient = new WebSocketClient(asyncHttpClient)
连接到serverURL
:
val listener = new WebSocketClient.LoggingListener(message => queue.put(message))
val completionStage = webSocketClient.call(serverURL, origin, listener)
val f = FutureConverters.toScala(completionStage)
测试服务器发送的消息:
whenReady(f, timeout = Timeout(1.second)) { webSocket =>
await().until(() => webSocket.isOpen && queue.peek() != null)
checkMsg1(queue.take())
checkMsg2(queue.take())
assert(queue.isEmpty)
}
例如:
private def checkMsg1(msg: String) {
val json: JsValue = Json.parse(msg)
json.validate[AdapterMsg] match {
case JsSuccess(AdapterNotRunning(None), _) => // ok
case other => fail(s"Unexpected result: $other")
}
}
整个示例可以在这里找到:scala-adapters (JobCockpitControllerSpec)
关于scala - 如何测试 Scala Play 框架 websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129203/