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

