Jest 测试失败,未定义窗口

Posted

技术标签:

【中文标题】Jest 测试失败,未定义窗口【英文标题】:Jest test fails with window is not defined 【发布时间】:2018-02-26 17:32:22 【问题描述】:

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

现在我正忙于让测试运行。出于某种原因,玩笑失败了

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)

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

【问题讨论】:

能否请您添加您的测试代码? 我添加了两张图片。我可以将 repo 公开,但它非常大,因为它基于我购买的 react/redux 模板,其中包含很多内容! 你用jsdom运行吗? 【参考方案1】:

我遇到了同样的问题,我不认为修改全局变量是解决问题的方法。问题是因为在我的笑话配置中,我将 testEnvironment 设置为 node,而应该是 jsdom。对我来说,这个设置位于 react starter 应用程序定义的 package.json 中。

【讨论】:

对于信息jsdom 是默认值(请参阅jestjs.io/docs/en/configuration.html#testenvironment-string),所以除非你已经覆盖它(就像他们在create-react-app 中所做的那样)你应该没问题 如果您需要支持画布,您需要将testEnvironment 设置为environment-jsdom-fourteen 并使用npm install --save-dev jest-environment-jsdom-fourteen github.com/jsdom/jsdom#canvas-support 安装它 如果你使用 react-native,很可能你正在使用 preset: react-native jest 配置,它会覆盖默认值以排除 DOM:jestjs.io/docs/en/tutorial-react-native#environment 我也遇到同样的错误,但我正在使用 vue.js,如果有任何建议请帮助我【参考方案2】:

在你的 package.json 中添加 windowglobal 这样的东西

"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": 
  

【讨论】:

这应该是对象而不是布尔变量:``` "window": ``` 不幸的是 create-react-app 不支持以这种方式配置全局变量。有什么建议吗? @Faust 查看 JacksonHaenchen 的回答 这可能会有所帮助,但它无论如何都是一个空对象,所以你没有userAgent等属性。也许这是一种从jsdom或其他东西映射到这里的对象的方法。会更有帮助【参考方案3】:

2021(开玩笑 27)

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

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

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

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

【讨论】:

但听起来应该可以在“节点”环境中拥有“窗口”等。是吗?我想通过从 jsdom 切换到节点来加快我的项目,但想知道是否可能,因为我对未定义的“窗口”有同样的问题。【参考方案4】:
npm i jest-environment-jsdom

index.test.tsx

/**
 * @jest-environment jsdom
 */

【讨论】:

以上是关于Jest 测试失败,未定义窗口的主要内容,如果未能解决你的问题,请参考以下文章

为啥这些 Jest 测试失败了? TypeError:无法读取未定义的属性“应用”

Jest.js强制窗口未定义。

导入反应图时,Jest 因“未定义自我”而失败

ReferenceError:未定义窗口。当我通过 jest 运行 npm test 进行单元测试时出现此错误

Jest / ESLint 失败未定义

使用 Jest 在 Nodejs 中测试 Azure 函数 - process.env 变量显示未定义