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

Next.js 14中使用Jest模拟Next-Auth v5的测试问题求助

Next-Auth v5 + Jest 模块找不到问题修复方案

核心原因

Next-Auth v5 属于 beta 版本,模块导出结构和 v4 差异显著,加上 Next.js 14 App Router 的模块解析规则,Jest 默认的模块解析逻辑无法正确识别 next-auth 模块,直接使用 jest.mock('next-auth') 无法解决问题。

分步解决方法

1. 配置 Jest 模块映射

在项目根目录的 jest.config.js 文件中添加模块映射,明确指定 next-auth 及其子模块的实际路径:

module.exports = {
  moduleNameMapper: {
    '^next-auth$': '<rootDir>/node_modules/next-auth/index.js',
    '^next-auth/react$': '<rootDir>/node_modules/next-auth/react/index.js',
    '^next-auth/providers/(.*)$': '<rootDir>/node_modules/next-auth/providers/$1.js',
  },
  // 保留其他原有 Jest 配置
}

2. 针对性模拟 Next-Auth 方法

不要直接 mock 整个 next-auth 模块,而是根据你在 auth.ts 中实际用到的方法进行精准模拟:

// 测试文件头部
jest.mock('next-auth', () => ({
  NextAuth: jest.fn().mockReturnValue({
    auth: jest.fn().mockResolvedValue({ user: { id: '1', email: 'test@example.com' } }),
    handlers: {
      GET: jest.fn(),
      POST: jest.fn().mockResolvedValue(new Response(null, { status: 200 })),
    },
    signIn: jest.fn().mockResolvedValue({ ok: true }),
  }),
  credentials: jest.fn().mockReturnValue({
    authorize: jest.fn().mockResolvedValue({ id: '1', email: 'test@example.com' }),
  }),
}));

3. 校验 auth.ts 导入路径

确保 auth.ts 中的导入语句路径正确,避免因相对路径或模块别名导致的解析错误:

// auth.ts 示例导入
import NextAuth from 'next-auth';
import authConfig from './auth.config';
import credentials from 'next-auth/providers/credentials';

export const { auth, handlers, signIn, signOut } = NextAuth({
  ...authConfig,
  providers: [credentials({
    // 你的 credentials 配置逻辑
  })],
});

4. 清除 Jest 缓存

缓存可能导致模块解析异常,执行以下命令清除缓存后重新运行测试:

npx jest --clearCache

额外提示

  • Next-Auth v5 处于 beta 阶段,模块结构可能随时调整,需保持依赖版本与官方文档同步
  • 若测试涉及 App Router 的路由处理器,需确保模拟 next-auth 返回的 handlers 对象与实际使用场景匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:13