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

如何使用Jest对Auth0的ManagementClient进行Mock测试?

解决Auth0 node-auth0库动态生成方法的Jest Mock问题

核心思路

Auth0通过工具类动态挂载到ManagementClient上的方法,Jest默认的自动Mock逻辑不会自动生成对应方法。我们不需要关注内部的wrapPropertyMethod实现逻辑,只需要在Mock ManagementClient的时候,手动给返回的实例添加对应方法的Mock函数即可。

完整测试代码示例

// auth0-post-login.test.js
const { onExecutePostLogin } = require('./auth0-post-login')
const { ManagementClient, __mockGetUserPermissions } = require('auth0')

// 每个用例执行前清空所有Mock的调用记录
beforeEach(() => {
  jest.clearAllMocks()
})

test('onExecutePostLogin 应该正确获取用户权限并设置到自定义Claim', async () => {
  // 1. 构造模拟的event和api对象
  const mockEvent = {
    user: {
      user_id: 'auth0|test123456'
    },
    secrets: {
      domain: 'test-domain.auth0.com',
      clientId: 'test-client-id',
      clientSecret: 'test-client-secret'
    }
  }
  const mockSetCustomClaim = jest.fn()
  const mockApi = {
    accessToken: {
      setCustomClaim: mockSetCustomClaim
    }
  }

  // 2. 设置getUserPermissions方法的模拟返回值
  __mockGetUserPermissions.mockResolvedValue([
    { permission_name: 'read:article' },
    { permission_name: 'edit:article' },
    { permission_name: 'delete:article' }
  ])

  // 3. 执行待测试方法
  await onExecutePostLogin(mockEvent, mockApi)

  // 4. 验证执行结果符合预期
  // 验证ManagementClient被正确实例化
  expect(ManagementClient).toHaveBeenCalledWith({
    domain: mockEvent.secrets.domain,
    clientId: mockEvent.secrets.clientId,
    clientSecret: mockEvent.secrets.clientSecret,
    audience: `https://${mockEvent.secrets.domain}/api/v2/`,
    scope: 'read:users'
  })
  // 验证getUserPermissions入参正确
  expect(__mockGetUserPermissions).toHaveBeenCalledWith({
    id: mockEvent.user.user_id,
    page: 0,
    per_page: 50,
    include_totals: false
  })
  // 验证自定义Claim被正确设置
  expect(mockSetCustomClaim).toHaveBeenCalledWith(
    'https://example.com/access',
    'read:article edit:article delete:article'
  )
})

//  Mock auth0模块
jest.mock('auth0', () => {
  // 构造getUserPermissions的Mock函数
  const mockGetUserPermissions = jest.fn()
  // 构造ManagementClient的Mock构造函数,实例返回带mock方法的对象
  const mockManagementClient = jest.fn(() => ({
    getUserPermissions: mockGetUserPermissions
  }))

  return {
    ManagementClient: mockManagementClient,
    __mockGetUserPermissions: mockGetUserPermissions
  }
})

扩展说明

如果业务代码中用到了多个类似的动态生成方法,只需要在Mock ManagementClient返回的实例对象里,按照同样的格式添加对应方法的Mock函数即可,不需要适配Auth0内部的wrap逻辑,只需要保证对外暴露的方法行为符合测试场景要求即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:45:04