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

如何在Next.js中用Cypress存根next-auth的useSession与getSession

存根不生效的核心原因

你的写法存在两个本质错误,导致存根完全无法替换原有逻辑:

  • 上下文隔离:Cypress测试脚本运行在独立的Node/测试Runner上下文,你在脚本里require("next-auth/react")拿到的模块实例,和浏览器中实际运行的前端业务代码加载的next-auth/react是完全独立的两个对象,对测试侧模块做cy.stub修改,根本不会影响浏览器内的代码执行。
  • 环境边界问题:你提到getSession()由客户端发HTTP请求触发后端调用,服务端运行的代码不在Cypress浏览器端的可控范围内,直接在前端侧存根服务端函数没有任何作用。
可直接落地的修复方案

前端侧Session逻辑Mock(覆盖useSession/客户端getSession)

不要尝试直接stub模块导出的方法,直接拦截NextAuth默认的Session拉取接口即可,所有前端Session相关逻辑底层都会请求这个接口,Mock后所有调用都会拿到你预设的测试数据:

// 拦截NextAuth默认session接口,返回Mock数据
cy.intercept("GET", "/api/auth/session", {
  statusCode: 200,
  body: {
    user: {
      name: "xxx",
      email: "xxx",
      image: "xxx",
    },
    expires: "2022-07-08T09:49:47.602Z",
  }
}).as("session")

// 访问目标页面
cy.visit(`/draft/cl45ip2d600379as17epvu6ti`)

// 可选:等待Session加载完成后再执行后续断言
cy.wait("@session")

这种写法不需要修改业务代码,也不存在模块实例不匹配的问题,是Cypress下Mock NextAuth Session的通用方案。

服务端getSession逻辑处理

Cypress作为端到端测试工具,无法直接Stub服务端运行的函数,两种标准处理方式:

  • 测试环境给NextAuth增加测试身份识别逻辑:Cypress发起请求时带上特定测试请求头/Cookie,服务端检测到后直接返回测试用Session,不需要走真实鉴权流程
  • 走真实登录流程:测试用例执行前先调用登录接口写入合法Session Cookie,再访问目标页面,这也是E2E测试的推荐实践,测试结果更贴近真实用户场景。
额外说明

只有在Cypress组件测试场景下,你才可以通过cy.mount的挂载选项注入Mock的NextAuth模块,直接stubuseSession/getSession方法;常规E2E测试下,测试脚本和浏览器业务代码完全隔离,直接stub导入的npm模块的写法100%不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:24:28