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)

我在谷歌上搜索了一段时间,没有任何结果。

This is my starting test.js

And this my App test code

67294 次浏览

包裹 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": {}
}
}

我也有同样的问题,我不认为修改全局变量是解决这个问题的方法。

问题在于,在我的 Jest 配置中,我将 testEnvironment设置为 node,而实际上它应该是 jsdom。对我来说,这个设置位于 React starter 应用程序定义的 包裹 Json文件中。

2021(Jest 27)

Jest 的 testEnvironment默认值是 jsdom,从27版本开始改为 node

您可以在配置文件中设置 testEnvironment: 'jsdom'以保持使用 JDOM。

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

Jest 27: New Default for Jest,2021 edition Jest 27: 玩笑的新默认设置,2021年版

npm i jest-environment-jsdom

文件 Index.test.tsx

/**
* @jest-environment jsdom
*/

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

只要您不需要任何高级特性,它就可以正常工作。这个答案与之前一些评价较高的答案相同,但也包括一些例子。

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


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


export default config;

Some TestCase.spec.ts

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