Jest测试失败,窗口未定义

Gun*_*app 38 webpack jestjs yarnpkg

我正在尝试开始学习最先进的Web开发学习React/Redux.

现在我坚持让测试运行.出于某种原因,jest失败了

Task :frontend:test 
yarn jest v1.0.2
$ "/Users/gunnar/git/app.oakstair.se/frontend/node_modules/.bin/jest" 
FAIL src/containers/App/App.test.js
  ? Test suite failed to run

 ReferenceError: window is not defined

  at Object.<anonymous> (config/polyfills.js:18:1)
  at next (native)
  at process._tickCallback (internal/process/next_tick.js:109:7)
Run Code Online (Sandbox Code Playgroud)

谷歌搜索了一段时间没有任何成功......

这是我的开始test.js

这是我的App测试代码

小智 53

在你的package.json中添加window类似全局的东西

"jest": {
  "verbose": true,
  "preset": "react-native",
  "setupFiles": ["./jest/setup.js"],
  "testRegex": "(/tests/.*|\\.(test|spec))\\.(ts|tsx|js)$",
  "transformIgnorePatterns": [
    "node_modules/(?!(jest-)?react-native|lottie-react-native)"
  ],
  "globals": {
    "window": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是对象而不是布尔变量:````window":{}``` (20认同)
  • 不幸的是 create-react-app 不支持以这种方式配置全局变量。有什么建议吗? (2认同)

Jac*_*hen 44

我有同样的问题,我不相信修改全局变量是这样做的方法.问题是因为在我的jest配置中,我已经testEnvironment设定了node它应该的时间jsdom.对我来说,这个设置位于package.json中,由react starter app定义.


j2L*_*L4e 11

2021 (Jest 27)

Jest 的testEnvironment默认值曾经是jsdom. 它已更改为node最近从版本 27 开始。

您可以testEnvironment: 'jsdom'在配置文件中设置以继续使用 JSDOM。

但是'node'似乎要快得多,因此您应该尽可能模拟浏览器 API。

https://jestjs.io/blog/2021/05/25/jest-27

  • 但听起来应该可以在“node”环境中拥有“window”等。是吗?我想通过从 jsdom 切换到 Node 来加速我的项目,但想知道是否可能,因为我对未定义的“窗口”有同样的问题。 (4认同)

小弟调*_*弟调调 7

npm i jest-environment-jsdom
Run Code Online (Sandbox Code Playgroud)

文件index.test.tsx

/**
 * @jest-environment jsdom
 */
Run Code Online (Sandbox Code Playgroud)


Sol*_*ers 7

如果您想保持testEnvironment设置为node,您可以window在 jest.config.js/ts 中配置一个全局变量,然后模拟您在测试用例中需要的内容。

只要您不需要任何高级功能,它就可以正常工作。它与之前一些高评价的答案相同,但包括一些示例。

import type {Config} from '@jest/types';

const config: Config.InitialOptions = {
  ...jestConfig,
  testEnvironment: "node",
  globals: {
    window: {
     location: {}
    }
  }
};

export default config;
Run Code Online (Sandbox Code Playgroud)

SomeTestCase.spec.ts

test('Is correct href', () => {
  window.location.href = 'https://somedomain.com';
  expect(window.location.href).toBe('https://somedomain.com');
})
Run Code Online (Sandbox Code Playgroud)