Troubleshooting
遇到什么问题了吗?使用本指南来解决 Jest 使用中的常见问题。
找不到测试失败的原因 #
请尝试使用 Node 内置的调试功能。
Note: Debugging support with Jest only supports
node debug
; it does yet supportnode inspect
due to an upstream issue in nodejs/node#7583. Until the upstream issue is resolved, debugging with Node is not available when using Node v8.x. For more details, see facebook/jest#1652.
在你的单元测试中添加一条 debugger;
语句,然后在项目目录中执行:
node --debug-brk ./node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --debug-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
如此一来,Jest 会运行在外部调试器可以连接的 Node 进程中。请注意,外部调试器未连接到进程之前,这一进程会暂停。
例如,想要将Node Inspector调试器连接到暂停的进程上,你需要先安装他(如果你尚未安装的话):
npm install --global node-inspector
随后就可以直接执行了:
node-inspector
这个命令会输出一个链接,你可以在 Chrome 中打开它。 打开这个链接以后,Chrome 开发者工具栏会自动打开,同时会在 Jest CLI 脚本的第一行设置断点(这些 Jest 都帮你做好了,否则打开开发者工具,添加断点的时候,Jest 早已运行完毕了)。 点击开发者工具中右上方调试菜单栏中的“开始调试” 按钮,让代码继续执行。 当 Jest 执行到添加了debugger;
语句的单元测试时,执行就会暂停,此时,你可以检查当前的值域和调用栈。
注︰CLI 中
--runInBand
选项能够确保 Jest 执行在同一个进程中,而非为在多个子进程中分别执行。 通常情况下,Jest 并行化测试会跨进程执行,但是很难同时调试多个进程。
更多关于 Node 调试的信息,可以查看这里
缓存问题 #
Jest 无法识别中间转换脚本的改动或者 Babel 的编译更新 ?
尝试使用 --no-cache
选项。 Jest 会缓存转换的模块文件来加速测试的执行。 If you are using your own custom transformer, consider adding a getCacheKey
function to it: getCacheKey in Relay.
未返回的 Promises #
如果一个 Promise 并未返回任何东西(no resolve)你会看到类似于下边的报错:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
通常这是由冲突的Promise 实现引发的。 可以考虑使用自己的实现来代替全局 Promise 实例,例如,global.Promise = require.requireActual('promise');
又或者将使用到的 Promise 库升级到单例模式。
If your test is long running, you may want to consider to increase the timeout by calling jest.setTimeout
jest.setTimeout(10000); // 10 second timeout
看门狗问题 #
此类问题可以尝试 --no-watchman
选项,或者设置watchman
为false
, 关掉 Jest 的 watchman 选项 。
更多详情,查看 看门狗疑难解答.
Docker 和/或 持续集成(CI,Continuous Integration)服务器中执行 Jest 测试极慢。 #
现代机器中的 CPU多核及 SSD 能够护航 Jest 使其执行迅速。但我们的用户 也反馈了一些问题 。
基于这些 已知的问题,有一个这种方案可以提速50%,那就是按顺序执行测试。
达成上述目的,可以使用--runInBand
选项:
# Using Jest CLI jest --runInBand # Using npm test (e.g. with create-react-app) npm test -- --runInBand
Another alternative to expediting test execution time on Continuous Integration Servers such as Travis-CI is to set the max worker pool to ~4. Specifically on Travis-CI, this can reduce test execution time in half. Note: The Travis CI free plan available for open source projects only includes 2 CPU cores.
# Using Jest CLI jest --maxWorkers=4 # Using npm test (e.g. with create-react-app) npm test -- --maxWorkers=4
使用 autoMock 工具时测试缓慢 #
无论是配置 automock: true
或者在测试中使用 jest.mock('my-module')
自动模拟会在大型项目中增加性能开销。 模块依赖越多,Jest 需要模拟的模块就越多。 有种可以大幅降低这种性能开销的方式,那就是增加一个代码转换器,将通常在模块头部执行的 import
和require
调用移动到模块内部,从而阻止他们的执行。 如此一来可以大量减少执行测试时,Jest 需要加载的模块的数量。
若要转换 import
语句,可以使用 babel-plugin-transform-inline-imports-commonjs Babel 插件,若要转换 require
语句, 可以使用 Facebook 提供的 inline-requires
Babel 插件,这个插件是 babel-preset-fbjs
的一部分。
我使用了 npm 3,但 node_modules 加载失败 #
将 jest-cli
升级到 0.9.0
或者更高版本
我使用了 Babel,但未模拟的模块引入不生效? #
将 jest-cli
升级到 0.9.0
或者更高版本
注释:
jest.dontMock('foo'); import foo from './foo';
在 ES6 中,模块引入出现在其他代码之前。
const foo = require('foo'); jest.dontMock('foo'); // Oops!
在 Jest 0.9.0 版本中引入一个新的 API jest.unmock
。同时引入了一个 Babel 插件,使用 babel-jest
后就能够正确运行。
jest.unmock('./foo'); // Use unmock! import foo from './foo'; // foo is not mocked!
查看 入门手册 获取更多 Babel 支持。
升级 Jest 0.9.0 测试失败? #
Jest 默认使用 Jasmine 2,通过 Jasmine的 升级手册 能够轻松解决这些问题。
如果你还是想用 Jasmine 1,将配置项 testRunner
设置为 jasmine1
或者在CLI 中传入 --testRunner=jasmine1
兼容问题 #
Jest 使用了 Node 4 提供的新特性。 我们建议您将 Node 升级到最新稳定版本。 Jest 需要的 Node 版本最低是 v4.0.0
。 0.x.x
是不支持的。
尚未解决问题? #
点 这里 查看帮助