Supposons que vous avez une bibliothèque de websocket qui retourne l'avenir [Itearatee [JsValue, Unité], recenseur [JsValue]] votre contrôleur utilise
trait WSLib {
def connect: Future[Itearatee[JsValue, Unit], Enumerator[JsValue]]
}
Et vous voulez tester cette bibliothèque.
Voici un contexte que vous pouvez utiliser:
trait WebSocketContext extends WithApplication {
val aSecond = FiniteDuration(1, TimeUnit.SECONDS)
case class Incoming(iteratee: Iteratee[JsValue, Unit]) {
def feed(message: JsValue) = {
iteratee.feed(Input.El(message))
}
def end(wait: Long = 100) = {
Thread.sleep(wait) //wait until all previous fed messages are handled
iteratee.feed(Input.EOF)
}
}
case class OutGoing(enum: Enumerator[JsValue]) {
val messages = enum(Iteratee.fold(List[JsValue]()) {
(l, jsValue) => jsValue :: l
}).flatMap(_.run)
def get: List[JsValue] = {
Await.result(messages, aSecond)
}
}
def wrapConnection(connection: => Future[Iteratee[JsValue, Unit], Enumerator[JsValue]]): (Incoming, OutGoing) = {
val (iteratee, enumerator) = Await.result(conn, aSecond)
(Incoming(iteratee), OutGoing(enumerator))
}
}
Ensuite, vos tests peuvent être écrits comme
"return all subscribers when asked for info" in new WebSocketContext {
val (incoming, outgoing) = wrapConnection(myWSLib.connect)
incoming.feed(JsObject("message" => "hello"))
incoming.end() //this closes the connection
val responseMessages = outgoing.get //you only call this "get" after the connection is closed
responseMessages.size must equalTo(1)
responseMessages must contain(JsObject("reply" => "Hey"))
}
entrants représentent les messages provenant du côté client, tandis que le sortant représente les messages envoyés du serveur. Pour écrire un test, vous devez d'abord introduire les messages entrants dans les messages entrants, puis fermer la connexion en appelant incoming.end, puis vous obtenez la liste complète des messages sortants de la méthode outgoing.get.
Bien que ce lien peut répondre à la question, il est préférable d'inclure les éléments essentiels de la réponse ici et de fournir le lien de référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –
@LawrenceAiello d'accord avec vous, mon mal à supposer que c'était assez trivial. J'ai mis à jour plus de détails. –