为什么我能够在node / jest中访问WebSocket本机浏览器对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我能够在node / jest中访问WebSocket本机浏览器对象?相关的知识,希望对你有一定的参考价值。

我有浏览器代码,它使用WebSocket aka的本机实现 var socket = new WebSocket('ws://localhost:8080')

虽然这个代码在我的浏览器中运行得很好,但我希望在用jest运行代码时它会失败。

但令人惊讶的是,我没有错误,它看起来效果非常好。我也很惊讶在控制台中没有任何更好的输出,我无法检查这个对象以查看我有权访问的内容。

test('should fail because I cannot see any WebSocket API in node.js doc', async () => {
    await new Promise( resolve => {
      const socket = new WebSocket('ws://localhost:8080')

      socket.onopen = function( event ){
        console.log( event )
        console.log( socket )
        console.log( socket.onopen )

        resolve()
      }
    })
})

它产生以下输出:

console.log tests/socket/socket.test.js:5
  Event { isTrusted: [Getter] }
console.log tests/socket/socket.test.js:6
  WebSocket {}
console.log tests/socket/socket.test.js:7
  [Function]

为什么这是开玩笑的?为什么我在jest中测试浏览器代码时不必使用像ws或socket.io这样的库? 这是因为开玩笑吗?

答案

默认情况下,Jest在JSDOM中运行你的测试,它实现了WebSocket。见https://jestjs.io/docs/en/configuration#testenvironment-string

以上是关于为什么我能够在node / jest中访问WebSocket本机浏览器对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest 进行测试时如何使用 `import.meta`

Supertest 在 Node 中进行 Jest 测试时出现 MaxListenersExceedingWarning 错误

在 Node + Express API 中检测到的打开句柄会阻止 Jest 退出

使用 Jest 和 Webpack 别名进行测试

使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

Jest - 模拟和测试 node.js 文件系统