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

使用@okta/okta-auth-js时Jest测试报TypeError问题求助

React Jest测试中@okta/okta-auth-js构造函数报错的解决方法

问题描述

我开发了一个React应用,用@okta/okta-auth-js包实现Okta单点登录(SSO),认证文件代码如下:

import OktaAuth, { OktaAuthOptions } from '@okta/okta-auth-js';

const oktaConfig: OktaAuthOptions = {
  issuer: `issuer_val_here`,
  ...etc,
};

const oktaAuth = new OktaAuth(oktaConfig);

应用运行正常,但跑Jest测试时直接报错:

TypeError: _oktaAuthJs.default is not a constructor

      28 | };
      29 |
    > 30 | const oktaAuth = new OktaAuth(oktaConfig);
         |                  ^

试过在package.json加moduleNameMapper、各种jest.mock写法和setupTests.js全局Mock,都没解决问题。

解决方案

这个问题是Jest处理@okta/okta-auth-js模块导出时的兼容问题,导致默认导出被解析成非构造函数类型,以下几种方法可以解决:

方法1:直接Mock构造函数

在测试文件顶部添加Mock代码,手动指定默认导出为模拟构造函数:

jest.mock('@okta/okta-auth-js', () => {
  // 模拟OktaAuth构造函数,同时返回带业务所需方法的实例
  const mockOktaAuth = jest.fn().mockImplementation(() => ({
    login: jest.fn().mockResolvedValue({}),
    logout: jest.fn().mockResolvedValue({}),
    getAccessToken: jest.fn().mockReturnValue('mock-token')
    // 按需添加你用到的其他方法
  }));

  // 导出类型定义(适配TypeScript)
  return {
    default: mockOktaAuth,
    OktaAuthOptions: jest.fn()
  };
});

方法2:全局Mock(所有测试生效)

如果多个测试文件都用到这个包,可以在setupTests.js里配置全局Mock:

// setupTests.js
jest.mock('@okta/okta-auth-js', () => {
  const mockOktaAuth = jest.fn().mockImplementation(() => ({
    // 按需定义方法
  }));

  return {
    default: mockOktaAuth,
    OktaAuthOptions: {}
  };
});

方法3:让Jest转译Okta包

部分情况下,Okta包的ES模块语法在Jest环境下未被正确转译,可在Jest配置中添加transformIgnorePatterns,让Jest处理该包:

// package.json中的jest配置
"jest": {
  "transformIgnorePatterns": [
    "/node_modules/(?!@okta/okta-auth-js)"
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:31:17