PlayアプリケーションにWebSocketがあり、そのテストを作成したいと思いますが、そのようなテストを書く方法の例は見つかりませんでした。私はplay-framework Googleグループのディスカッションを見つけましたが、最近活動はありません。PlayFrameworkでWebSocketをテストする
JavaテストでWebSocketをテストする方法はありますか?
PlayアプリケーションにWebSocketがあり、そのテストを作成したいと思いますが、そのようなテストを書く方法の例は見つかりませんでした。私はplay-framework Googleグループのディスカッションを見つけましたが、最近活動はありません。PlayFrameworkでWebSocketをテストする
JavaテストでWebSocketをテストする方法はありますか?
私はFirefoxを使用してのWebSocketコードをテスト:Java用
それはFIREFOX "と同様の交換 'HTMLUNIT' を作品:http://www.playframework.com/documentation/2.1.x/JavaFunctionalTest
あなたはIteratee、列挙子の基礎となる取得し、それらを直接テストすることができます。この方法では、ブラウザを使用する必要はありません。 iterateesの非同期性に対処するには、akka-testkitが必要です。
A Scalaの例:
object WebSocket extends Controller {
def websocket = WebSocket.async[JsValue] { request =>
Future.successful(Iteratee.ignore[JsValue] -> Enumerator.apply[JsValue](Json.obj("type" -> "error")))
}
}
class WebSocketSpec extends PlaySpecification {
"WebSocket" should {
"respond with error packet" in new WithApplication {
val request = FakeRequest()
var message: JsValue = null
val iteratee = Iteratee.foreach[JsValue](chunk => message = chunk)(Akka.system.dispatcher)
Controller.websocket().f(request)(Enumerator.empty[JsValue],iteratee)
TestKit.awaitCond(message == Json.obj("type" -> "error"), 1 second)
}
}
}
は、あなたが将来返すのWebSocketライブラリがあると[Itearatee [JsValue、ユニット]、列挙子は[JsValue]]あなたのコントローラは
trait WSLib {
def connect: Future[Itearatee[JsValue, Unit], Enumerator[JsValue]]
}
を使用し、このライブラリをテストします。ここで
は、使用できるコンテキストです:送信は、送信されたメッセージを表しながら、あなたのテストが
"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"))
}
着信のように書くことができ
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))
}
}
は、クライアント側からのメッセージを表現しますサーバーから。テストを書くには、最初に着信メッセージを受信してからincoming.endを呼び出して接続を終了し、outgoing.getメソッドから送信メッセージの完全なリストを取得します。
Chromeは、Webソケットサービスをテストするためにpluginを提供しています。
編集
ですから、WebSocketのURLと要求データを提供し、サービスにメッセージを送ることができます(下の写真のように)プラグインを使用。メッセージログには、クライアントから送信されたメッセージとサービス応答も表示されます。
このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –
@LawrenceAielloはあなたに同意します、それはかなり些細だったと仮定するのは間違いです。私は詳細を更新しました。 –