开发者问题收集

当我根本没有使用它时,为什么会出现 ReferenceError: setImmediate 没有定义?

2022-12-23
3359

我用 React 和 Nest 创建了一个小应用程序,以了解 WebScoket API。 为了不浪费时间,我想将其包装为可部署的应用程序,并将其托管在某个地方。

代码在这里: https://github.com/An1mus/chitchat

在添加一些基本工作流程时,我遇到了以下错误的问题,该错误在运行测试后出现(测试用例通过):

/Users/andrewpetrov/Projects/an1mus/chitchat/client/node_modules/.pnpm/[email protected]/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:628
        setImmediate(function() { self["on" + event]() })
        ^

ReferenceError: setImmediate is not defined
    at XMLHttpRequest.dispatchEvent (/Users/andrewpetrov/Projects/an1mus/chitchat/client/node_modules/.pnpm/[email protected]/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:628:9)
    at setState (/Users/andrewpetrov/Projects/an1mus/chitchat/client/node_modules/.pnpm/[email protected]/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:654:12)
    at XMLHttpRequest.handleError (/Users/andrewpetrov/Projects/an1mus/chitchat/client/node_modules/.pnpm/[email protected]/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:572:5)
    at ClientRequest.errorHandler (/Users/andrewpetrov/Projects/an1mus/chitchat/client/node_modules/.pnpm/[email protected]/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:490:14)
    at ClientRequest.emit (node:events:527:28)
    at Socket.socketErrorListener (node:_http_client:454:9)
    at Socket.emit (node:events:527:28)
    at emitErrorNT (node:internal/streams/destroy:164:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21)

出于某种原因,当我运行测试时,它会触发,即使我唯一的测试是这样的:

import React from 'react';
import { render } from '@testing-library/react';
import App from './App';

test('renders the app', async () => {
  // this is a workaround for issue #1695 in jsdom
  window.HTMLElement.prototype.scrollIntoView = function() {};

  const {container} = await render(<App />);
  expect(container.querySelector('h1')).toHaveTextContent('Welcome to ChitChat')
});

测试使用 react-scripts test --watchAll=false 运行>

什么会导致这样的错误? 我的猜测是我错误地编写了测试,它与应用程序一起呈现的 WebScokets 有某种联系。

我将不胜感激任何提示。

2个回答

现在回答这个问题可能有点晚了,但这似乎是节点环境的问题。

要解决此问题:

  1. 安装 polyfill:npm install --save setimmediate
  2. 在您的 setupTests.js 中:import 'setimmediate';
Honey Sharma
2023-09-16

研究了这个问题之后。

我发现了 2 个主要线程可以帮助你。

  1. 你可以看看这个 https://github.com/prisma/prisma/issues/8558 我发现与你相关的内容,将其添加到 jest.config.js 中:
global.setImmediate = jest.useRealTimers;

同一线程上有类似的方法:

/**
 * @jest-environment jsdom
 */

import {setImmediate} from 'timers'
  1. 我发现的另一种方法是 jsdom 已被弃用,现在 jest.config.js 文件上的设置应该是:
testEnvironment: 'node'

自 v27 起已弃用。您可以在此处扩展信息: https://jestjs.io/blog/2021/05/25/jest-27

Augusto Gonzalez
2023-09-22