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

