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

React使用Jest写单元测试时MsalAuthenticationTemplate出现act未包裹报错

问题解决方案:Jest测试Msal组件act警告及Mock示例

报错原因

该警告是@azure/msal-react包内的MsalAuthenticationTemplate、MsalProvider组件内部存在异步状态更新逻辑,测试执行结束时组件内部的状态更新还未完成,既会触发act警告,也会导致覆盖率统计、测试结果输出异常。

全局Mock方案(推荐)

在jest的全局配置文件(通常为jest.setup.js/jest.setup.ts)中添加如下mock逻辑,直接绕过msal组件的内部状态更新逻辑:

jest.mock('@azure/msal-react', () => ({
  ...jest.requireActual('@azure/msal-react'),
  // 模拟MsalAuthenticationTemplate默认直接渲染子组件,跳过内部授权逻辑
  MsalAuthenticationTemplate: ({ children }) => <>{children}</>,
  // 配套mock常用的useMsal hook,可按需扩展返回值
  useMsal: () => ({
    instance: {
      acquireTokenSilent: jest.fn().mockResolvedValue({
        accessToken: 'test-access-token',
        account: { username: 'test@example.com' }
      }),
      loginRedirect: jest.fn(),
      logout: jest.fn()
    },
    accounts: [{ username: 'test@example.com' }],
    inProgress: 'none'
  }),
  // 模拟MsalProvider跳过初始化逻辑
  MsalProvider: ({ children }) => <>{children}</>
}));

单测试用例自定义Mock方案

如果需要针对不同测试场景模拟不同的授权状态,可以在单个测试文件内覆写mock:

import { MsalAuthenticationTemplate } from '@azure/msal-react';

jest.mock('@azure/msal-react', () => ({
  ...jest.requireActual('@azure/msal-react'),
  MsalAuthenticationTemplate: jest.fn()
}));

describe('组件测试用例集', () => {
  beforeEach(() => {
    // 默认模拟已登录状态,直接渲染子组件
    MsalAuthenticationTemplate.mockImplementation(({ children }) => <>{children}</>);
  });

  test('测试未登录场景的展示逻辑', () => {
    // 自定义未登录时的返回内容
    MsalAuthenticationTemplate.mockImplementation(() => <div>未授权访问</div>);
    // 下方写你的组件渲染和断言逻辑即可
  })
})

额外注意事项

  • 测试过程中所有涉及异步操作的断言,优先使用React Testing Library提供的findBy*系列异步查询方法,或者用waitFor包裹断言逻辑,上述方法已经内置了act处理,不需要手动调用act
  • 若项目还用到了其他msal-react的Hooks或组件,可以按照上述mock逻辑按需扩展返回值即可

内容的提问来源于stack exchange,提问作者MSH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:15:08