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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:28:34