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

如何使用Jest为@okta/jwt-verifier模拟不同响应?

在同一Jest测试套件中动态修改@okta/jwt-verifier的Mock实现

要在同一测试套件的不同用例里切换mock的行为,核心是把verifyAccessToken改成可动态修改的Jest Mock函数,而不是写死返回值。具体步骤如下:

1. 修改全局Mock定义

先把你的jest.mock代码改成这样,让verifyAccessToken成为一个可复用的mock函数,并设置默认的成功返回:

jest.mock("@okta/jwt-verifier", () => {
  // 创建一个可动态修改的mock函数,默认返回成功结果
  const mockVerifyAccessToken = jest.fn().mockResolvedValue({ foo: "bar" });
  
  return jest.fn().mockImplementation(() => ({
    verifyAccessToken: mockVerifyAccessToken,
  }));
});

2. 获取Mock函数引用

在测试文件中,通过jest.spyOn获取原型上的mock函数,方便后续修改:

import { OktaJwtVerifier } from "@okta/jwt-verifier";
import { verifyAccessToken } from "./your-file-path"; // 替换成你的实际文件路径

// 获取verifyAccessToken的mock引用
const mockVerifyAccessToken = jest.spyOn(OktaJwtVerifier.prototype, 'verifyAccessToken');

3. 在测试用例中动态修改行为

在测试套件里,利用beforeEach重置mock状态,再针对每个用例单独定义返回结果:

describe('verifyAccessToken 功能测试', () => {
  // 每个测试前重置mock,避免用例间污染
  beforeEach(() => {
    mockVerifyAccessToken.mockReset();
    // 重置默认返回成功结果
    mockVerifyAccessToken.mockResolvedValue({ foo: "bar" });
  });

  test('正常验证:返回成功结果', async () => {
    const result = await verifyAccessToken('valid-token');
    expect(mockVerifyAccessToken).toHaveBeenCalledWith('valid-token', 'audience');
    expect(result).toEqual({ foo: "bar" });
  });

  test('令牌过期:抛出过期错误', async () => {
    // 模拟Okta实际抛出的过期错误(匹配错误类型和信息)
    const expiredError = new Error('The token is expired');
    expiredError.name = 'TokenExpiredError';
    mockVerifyAccessToken.mockRejectedValue(expiredError);

    await expect(verifyAccessToken('expired-token')).rejects.toThrow('The token is expired');
    await expect(verifyAccessToken('expired-token')).rejects.toBeInstanceOf(Error);
    expect(mockVerifyAccessToken).toHaveBeenCalledWith('expired-token', 'audience');
  });

  test('无效令牌:抛出验证失败错误', async () => {
    mockVerifyAccessToken.mockRejectedValue(new Error('Invalid token'));

    await expect(verifyAccessToken('invalid-token')).rejects.toThrow('Invalid token');
  });
});

关键说明

  • mockReset():清除之前测试用例的调用记录和自定义实现,确保每个用例的mock状态独立
  • mockResolvedValue():设置异步函数的成功返回值
  • mockRejectedValue():设置异步函数的失败抛出错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:12:41