typescript 如何测试deno WebSocket Server?

qlfbtfca  于 7个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(108)

我已经使用deno在Typescript中编写了一个小型的WebSocket Server类。
现在,我想测试一下。当我运行服务器并关闭它时,一切都很好。
但是当我尝试通过new WebSocket("ws://{myserver}")连接到测试用例中的服务器时,我得到以下错误:
测试用例泄露了安全操作。
我的代码:

Deno.test("run server", (): void => {
    const serverConfig = {
        autoServe: true,
        host: "localhost",
        port: 3045,
    };

    const server = new WSServer(serverConfig);

    console.log(server);

    const conn = new WebSocket("ws://localhost:3045");

    conn.send("hello");

    conn.close();

    assertEquals<number>(server.config.port, serverConfig.port);

    assertEquals<boolean>(server.listening, true);

    server.close();
});

字符串
有什么解决办法吗?

8zzbczxx

8zzbczxx1#

我找到了解决这个问题的方法。我必须等待WebSocket连接打开。但是当我在连接上发送一些东西并关闭连接时,它不会发送数据,我必须关闭连接,因为否则Deno会给我错误,
测试用例泄漏了安全操作
所以我在我的服务器代码中实现了,它向每个发送的数据发送一个答案。
在工作服务器上,我将发送一个带有唯一代码的确认消息。
因此,对于测试用例(目前,它不对确认消息做任何事情,只侦听来自服务器的任何消息),我现在有:

Deno.test("run server", async () => {
    const serverConfig = {
        autoServe: true,
        host: "localhost",
        port: 3045,
    };

    const server = new WSServer(serverConfig);

    const conn = new WebSocket("ws://localhost:3045");

    const awaitOpen = (connection: WebSocket): Promise<boolean> => {
        return new Promise(resolve => {
            conn.addEventListener("open", () => {
                resolve(true);
            });
        });
    };

    const awaitResponse = (connection: WebSocket): Promise<string> => {
        return new Promise(resolve => {
            conn.addEventListener("message", (event) => {
                resolve(String(event.data));
            });
        });
    }

    await awaitOpen(conn);

    conn.send("hello");

    const response = await awaitResponse(conn);

    if (response) {
        conn.close();

        server.close();
    }

    assertEquals<number>(server.config.port, serverConfig.port);

    assertEquals<boolean>(server.listening, true);
});

字符串
我希望这对某人有帮助。

lsmd5eda

lsmd5eda2#

https://deno.land/x/[email protected]

SugarWs

您可以尝试使用此帮助程序来简化此类问题的解决方案,特别是在测试中。

  • 这是一个简单的WebSocket的 Package 器,是我写的,用来解决你上面描述的问题。用promise以casic的方式处理边缘socket的状态,确保start/finich test等。*
  • 所以如果你感兴趣,你可以检查这个模块.它加减使相同的逻辑,你在你的答案中提供.*

相关问题