我正在尝试使用WithBrowser:对我的WebSocket代码进行一些简单的集成测试
class ApplicationControllerSpec extends Specification{
"Application Controller" should {
"do something" in new WithBrowser{
browser.goTo("http://localhost:3333")
browser.pageSource must contain("Hello")
}
}
}
当我这样做的时候,我会得到一个很长的错误,但其中一部分说:
WebDriverException:com.gargoylesoftware.htmlunit.ScriptException:ReferenceError:未定义"WebSocket"。
是否有一种替代的WebDriver确实实现了WebSocket?或者,有没有办法让它真正打开firefox或chrome?
我也很感激关于如何测试WebSocket代码的任何建议,但这里似乎还有另一个未回答的问题。
我正在使用Play 2.1.3。
我用Firefox测试WebSockets:
https://github.com/schleichardt/stackoverflow-answers/commit/13d5876791ef409e092e4a097f54247d851e17dc#L8R14
WithBrowser
支持浏览器作为第一个参数,请参阅文档。
所以它可能看起来像
class ApplicationControllerSpec extends Specification{
"Application Controller" should {
"do something" in new WithBrowser(play.api.test.Helpers.FIREFOX){
browser.goTo("http://localhost:3333")
browser.pageSource must contain("Hello")
}
}
}
如果您使用firefox,最好为其加载最新的selenium驱动程序。
我不知道你为什么要使用WithBrowser来测试你的websocket,但这是我是怎么做的:
class ApplicationSpec extends Specification {
"Application" should {
"work" in {
running(TestServer(9000)) {
val client = new WebSocketClient(URI.create("ws://localhost:9000/test"),
new Draft_17(), Map("HeaderKey1" -> "HeaderValue1"), 0) {
def onError(p1: Exception) {
println("onError")
}
def onMessage(message: String) {
println("onMessage, message = " + message)
}
def onClose(code: Int, reason: String, remote: Boolean) {
println("onClose")
}
def onOpen(handshakedata: ServerHandshake) {
println("onOpen")
}
}
client.connectBlocking()
client.send("message")
Thread.sleep(1000)
success
}
}
}
}
我正在使用Java WebSocket来调用WebSocket。这个库甚至可以发送握手过程中的自定义http头。
请注意,我不做任何断言,所以我必须在测试结束时返回成功。我需要一个Thread.sleep,否则可能会发生RuntimeException("没有启动的应用程序"),因为测试在websocket通信完成之前完成。