如何在package.json的Jest配置中添加全局crypto解决MSAL测试报错
问题根因
Jest 基于 jsdom 模拟浏览器环境运行测试,jsdom 默认未内置 Web Crypto API,MSAL 初始化 PublicClientApplication 时会全局检测 crypto/msCrypto 对象,检测失败就会抛出 crypto_nonexistent 错误。
方案1:保留 package.json 内嵌 Jest 配置(适配 CRA 默认规则,推荐)
Create React App 有默认的测试文件加载规则,不需要修改 package.json 内的 Jest 配置,也不需要额外传配置参数,按以下步骤操作即可:
- 安装 polyfill 依赖:
npm install @peculiar/webcrypto --save-dev
- 如果项目
src目录下没有setupTests.js就新建该文件,已有则直接追加以下内容:
const { Crypto } = require('@peculiar/webcrypto'); // 注入MSAL依赖的全局crypto对象 window.crypto = new Crypto(); // 兼容旧版MSAL的msCrypto检测逻辑 window.msCrypto = window.crypto;
- 直接运行原有
npm test命令即可,CRA 会自动加载src/setupTests.js中的全局配置,不需要修改任何现有 Jest 配置项。
方案2:使用独立 jest.config.js 配置的正确写法
之前迁移配置失败的核心原因是 react-scripts 不支持通过 --config 参数传入自定义配置路径,正确配置方式如下:
- 先安装
@peculiar/webcrypto依赖,按方案1的步骤创建好src/setupTests.js写入 polyfill 逻辑。 - 项目根目录新建
jest.config.js,写入配置时注意继承 CRA 原有默认配置,不要完全重写:
module.exports = { preset: 'react-scripts', // 继承CRA默认Jest规则 collectCoverageFrom: [ "src/**/*.{js,jsx}", "!src/**/*.{config,stories}.js", "!src/**/index.js" ], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80, statements: 80 } }, setupFiles: ['<rootDir>/src/setupTests.js'] };
- package.json 中的 test 脚本保持默认的
"test": "react-scripts test"即可,不需要追加任何参数,react-scripts 会自动读取根目录的 jest.config.js 覆盖默认配置。
避坑提示
- 不要手动给全局挂载空的
crypto对象,MSAL 会调用crypto.subtle等完整 Web Crypto API,空对象会触发后续的API不存在错误,必须使用完整的合规polyfill。 - 不要在业务代码里加测试环境判断逻辑注入crypto,保持环境配置和业务代码分离。
内容的提问来源于stack exchange,提问作者kpozzi90
相关产品推荐
相关产品推荐

