Załóżmy, że masz biblioteki websocket zwracającą przyszłości [Itearatee [JsValue, jednostkowa] Enumerator [JsValue]] wykorzystuje kontroler
trait WSLib {
def connect: Future[Itearatee[JsValue, Unit], Enumerator[JsValue]]
}
I chcesz przetestować tę bibliotekę.
Oto kontekst można użyć:
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))
}
}
Zmodyfikowane testy mogą być zapisywane jako
"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"))
}
Incoming reprezentują wiadomości pochodzących od strony klienta, a ustępujący reprezentuje wiadomości wysłanych z serwera. Aby napisać test, najpierw wysyłasz przychodzące wiadomości przychodzące, a następnie zamykasz połączenie, wywołując plik incoming.end, a następnie otrzymujesz pełną listę wychodzących wiadomości z metody outgoing.get.
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest to tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –
@LawrenceAiello zgadzam się z tobą, moje złe, zakładając, że to było dość trywialne. Zaktualizowałem więcej szczegółów. –