scala - 如何测试 Scala Play 框架 websocket?

标签 scala unit-testing playframework specifications playframework-2.5

如果我有一个如下所示的网络套接字:

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/

相关文章:

c# - 如何使用流畅的断言来组合集合和属性断言?

java - Playframework 2.3.9 sbt 在 heroku 上构建导入失败

scala - 如何在Play 2中指定复杂的表单验证?

scala - Apache Spark - 数据集操作在抽象基类中失败?

Scala:reduce 和 Fold 之间函数类型推断的差异 - 可以对此采取措施吗?

javascript - Controller 测试模拟工厂

java - 如何将基于play框架的项目以更好的形式制作成eclipse项目?

Scala 可变集合和 "Reference must be prefixed warnings"

java - Scala,参数化特征的具体实现的反射(reflect)

c# - 如何在单元测试中模拟字符串响应?