【问题标题】:How to properly test web socket connection with KotlinJS如何使用 Kotlin JS 正确测试 websocket 连接
【发布时间】:2018-07-25 11:56:20
【问题描述】:

我无法测试使用本机 WebSocket 的代码。这是测试函数的主体:

val webSocket = WebSocket("ws://localhost:8888")
window.setTimeout({
    assertEquals(WebSocket.OPEN, webSocket.readyState)
}, 1000)

我将 Karma 与 Mocha 测试运行器一起使用。以下代码执行时没有任何错误,但 setTimeout 实际上被忽略且从未执行。

Mocha 似乎支持使用--delay 的基于setTimeout 的测试。但是,当我将标志与 client: { mocha: { delay: true } } Karma 配置一起使用时,测试只是冻结并失败,输出以下原因消息:

已断开连接,因为 60000 毫秒内没有消息。

使用setTimeout 执行测试的正确方法是什么?如果这很棘手,有没有其他方法可以在 WebSocket 完全连接后对其执行断言?我还没有使用任何特定于 Mocha 的功能,所以我不介意更改框架。

【问题讨论】:

    标签: kotlin mocha.js karma-mocha kotlin-interop kotlin-js-interop


    【解决方案1】:

    如果你想测试异步代码,你需要在测试完成时告诉测试框架。 请参阅此answer

    【讨论】:

    • 是的,我最终使用了 Mocha 绑定并使用 describe/it 来使用 done 回调。
    • 请注意,也可以使用Promise 来实现。做出测试返回承诺并在断言完成后调用resolve
    【解决方案2】:

    从 @Test 函数返回 Promise 应该可以解决问题。 比如:

    @Test fun testWebSocket() = Promise<Unit> { resolve, reject ->
        val webSocket = WebSocket("ws://localhost:8888")
        window.setTimeout({
            assertEquals(WebSocket.OPEN, webSocket.readyState)
            resolve(Unit)
        }, 1000)
    }
    

    【讨论】:

    • 在 1.2.20 中添加了 Promise 支持,应该可以在 Mocha、Jasmine 和 Jest 中使用。这不是最终设计,很可能会有更方便的方法。
    • 如果测试可以使用 done: () -&gt; Unit 回调会很方便,类似于 Mocha 解决这个问题的方式。但是,我认为基于Promise 的方法是目前最好的,因为它不需要外部绑定。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2023-01-31
    • 2018-04-02
    相关资源
    最近更新 更多