NextJS组件测试:Jest环境与getServerSession兼容问题求助
解决Next.js服务端组件(含getServerSession)的Jest测试环境冲突问题
针对你遇到的环境冲突问题,核心思路是拆分测试场景,针对性处理服务端逻辑与组件渲染的测试环境,具体方案如下:
1. 组件渲染测试:Mock getServerSession,用jsdom环境
服务端组件中getServerSession的作用是获取会话状态,组件渲染只依赖它的返回值,不需要真实调用服务端会话逻辑。直接mock这个方法,就能在jsdom环境下正常测试组件:
// CreateGymLink.test.tsx import { render, screen } from '@testing-library/react'; import CreateGymLink from '@/app/gyms/components/CreateGymLink'; import { getServerSession } from 'next-auth/next'; // Mock next-auth的getServerSession jest.mock('next-auth/next', () => ({ getServerSession: jest.fn(), })); describe('CreateGymLink Component', () => { test('不渲染按钮(无会话时)', async () => { // 模拟无会话的返回值 (getServerSession as jest.Mock).mockResolvedValue(null); render(await CreateGymLink()); expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); test('渲染按钮(有会话时)', async () => { // 模拟已认证的会话数据 (getServerSession as jest.Mock).mockResolvedValue({ user: { id: 'user_123', email: 'test@example.com' }, }); render(await CreateGymLink()); expect(screen.getByRole('button')).toBeInTheDocument(); }); });
这样处理后,组件测试完全在jsdom环境运行,既不会出现document is not defined的错误,也避开了jose模块在node环境的ES语法问题。
2. 服务端逻辑测试:单独用node环境
如果需要测试getServerSession的真实调用逻辑、Server Actions等服务端专属代码,在对应测试文件顶部添加环境注释:
/** * @jest-environment node */ // 这里编写服务端逻辑的测试,比如验证会话权限、Server Actions的业务逻辑等
这种方式让服务端逻辑在node环境运行,解决jose模块的语法错误。
3. 可选:全局配置Jest环境(按需)
如果大部分测试是组件渲染(jsdom),少数是服务端逻辑(node),可以在jest.config.js中设置默认环境为jsdom,然后给服务端测试文件单独加环境注释,无需全局修改。
内容的提问来源于stack exchange,提问作者Harold
相关产品推荐
相关产品推荐

