如何使用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
相关产品推荐
相关产品推荐

