Javascript 测试Socket.io:调用Socket.prototype.disconnect后运行断言 问题

Javascript 测试Socket.io:调用Socket.prototype.disconnect后运行断言 问题,javascript,socket.io,jestjs,Javascript,Socket.io,Jestjs,注意:这是出于演示目的而设计的示例,不是我在项目中测试的实际代码。 我正在使用为我的服务器编写测试 我想测试在套接字断开连接后是否调用特定函数(MyController.prototype.disconnect) 这是我要测试的代码: const handleDisconnect=()=>{ myController.disconnect();//我想测试是否调用了它。 log(`Socket${Socket.id}已断开连接。`); }; 插座打开(“断开”,手柄断开); 但是,在编写断言之

注意:这是出于演示目的而设计的示例,不是我在项目中测试的实际代码。

我正在使用为我的服务器编写测试

我想测试在套接字断开连接后是否调用特定函数(
MyController.prototype.disconnect

这是我要测试的代码:

const handleDisconnect=()=>{
myController.disconnect();//我想测试是否调用了它。
log(`Socket${Socket.id}已断开连接。`);
};
插座打开(“断开”,手柄断开);
但是,在编写断言之前,我不知道如何等待执行
Socket.prototype.disconnect
完成(这不是异步的)

重现问题
  • 安装依赖项:
  • 创建一个名为
    demo.test.js
    的文件,并粘贴到下面的代码中
  • const ioClient=require('socket.io client');
    const ioServer=require('socket.io');
    类MyController{
    构造函数(){}
    断开连接(){
    log('MyController.prototype.disconnect');
    }
    }
    描述('demo',()=>{
    让端口=5000,
    uri=`http://localhost:${port}`,
    连接选项={
    “重新连接延迟”:0,
    “重新打开延迟”:0,
    “强制新连接”:true,
    传输:['websocket']
    };
    让服务器;
    让我来控制;
    在每个之前(()=>{
    server=ioServer().listen(端口);
    server.on('连接',(套接字)=>{
    log(`Socket${Socket.id}已连接。`);
    myController=新的myController();
    const handleDisconnect=()=>{
    myController.disconnect();
    log(`Socket${Socket.id}已断开连接。`);
    };
    插座打开(“断开”,手柄断开);
    });
    });
    每次之后((完成)=>{
    server.close();
    完成();
    });
    const createClient=()=>{
    返回ioClient.connect(uri,connectOptions);
    }
    描述('handleDisconnect',()=>{
    仅测试('当套接字断开连接时应调用MyController.prototype.disconnect',(完成)=>{
    const client=createClient();
    client.on('connect',()=>{
    //模拟MyController.prototype.disconnect以查看是否调用了它
    const myControllerDisconnectMock=jest.fn();
    myController.disconnect=myControllerDisconnectMock;
    client.disconnect();//我想等待这个
    /**
    *我想在client.disconnect()运行之后在这里放置断言
    */
    console.log('foo');//但请注意,这在client.disconnect()之前运行
    expect(myControllerDisconnectMock.mock.calls.length).toBe(1);
    完成();
    });
    });
    });
    });
    
  • 运行测试:
  • 控制台输出(为简洁起见简化):

    'MyController.prototype.disconnect'
    未被记录,因为原型方法被模拟

    Expected: 1
    Received: 0
      console.log demo.test.js:32
        Socket OKkN21L8dBzzrRiuAAAA has connected.
    
      console.log demo.test.js:72
        foo
    
      console.log demo.test.js:38
        Socket OKkN21L8dBzzrRiuAAAA has disconnected.
    

    使用…直接调用控制器中的断开功能。。。。并通过必要的参数,您知道socket.io将通过测试socket.io断开连接。。。想象一下,您的控制器断开连接函数被调用。直接使用….调用控制器中的断开连接函数。。。。并通过必要的参数,您知道socket.io将通过测试socket.io断开连接。。。想象一下,您的控制器断开功能被调用
    jest demo.test.js
    
    Expected: 1
    Received: 0
      console.log demo.test.js:32
        Socket OKkN21L8dBzzrRiuAAAA has connected.
    
      console.log demo.test.js:72
        foo
    
      console.log demo.test.js:38
        Socket OKkN21L8dBzzrRiuAAAA has disconnected.