Предположим, что у вас есть библиотека WebSocket, возвращающую Future [Itearatee [JsValue, Unit], Enumerator [JsValue]] контроллер использует
trait WSLib {
def connect: Future[Itearatee[JsValue, Unit], Enumerator[JsValue]]
}
И вы хотите протестировать эту библиотеку.
Вот контекст вы можете использовать:
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))
}
}
Тогда ваши тесты могут быть записаны как
"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.end, после чего вы получаете полный список исходящих сообщений из метода outgoing.get.
Хотя эта ссылка может ответить на этот вопрос, то лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –
@LawrenceAiello согласен с тобой, мой плохо предположить, что это было довольно тривиально. Я обновил более подробную информацию. –