You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 08:33:35