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

Next.js 13集成Supabase单元测试报错:Unexpected token 'export'

解决Next.js 13 + Supabase单元测试的SyntaxError问题

问题根源

createClientComponentClient() 是Supabase专为Next.js App Router客户端组件设计的方法,Jest默认的模块解析逻辑没法处理它的ES模块导出格式,直接执行会触发Unexpected token 'export'错误。同时这个方法依赖客户端环境,测试时必须Mock掉真实实现。

解决方案步骤

1. 配置Jest适配Next.js环境

用Next官方提供的next/jest预设,它会自动处理Next.js的模块解析和ES模块兼容:
在jest.config.js里添加:

const nextJest = require('next/jest')

const createJestConfig = nextJest({
  dir: './', // 你的Next.js项目根目录
})

const customJestConfig = {
  testEnvironment: 'jsdom', // 客户端组件测试需要jsdom环境
  moduleNameMapper: {
    // 可选:处理CSS等静态资源的Mock
    '^.+\\.(css|sass|scss)$': '<rootDir>/__mocks__/styleMock.js',
  },
}

module.exports = createJestConfig(customJestConfig)

2. Mock createClientComponentClient

在测试文件顶部直接Mock这个方法,返回模拟的Supabase客户端,避免执行真实逻辑:

import { render, screen, fireEvent } from '@testing-library/react'
import SignUpPage from '../app/signup/page'
import { RouterContext } from 'next/dist/shared/lib/router-context'

// Mock Supabase的客户端创建方法
jest.mock('@supabase/auth-helpers-nextjs', () => ({
  createClientComponentClient: jest.fn(() => ({
    auth: {
      signUp: jest.fn().mockResolvedValue({
        data: { user: { id: 'test-id' } },
        error: null,
      }),
    },
  })),
}))

// 模拟RouterContext的必要属性
const mockRouter = {
  push: jest.fn(),
  replace: jest.fn(),
  prefetch: jest.fn(),
}

test('渲染注册页面并模拟提交', async () => {
  render(
    <RouterContext.Provider value={mockRouter}>
      <SignUpPage />
    </RouterContext.Provider>
  )

  // 输入测试数据
  fireEvent.change(screen.getByLabelText(/邮箱/i), { target: { value: 'test@example.com' } })
  fireEvent.change(screen.getByLabelText(/密码/i), { target: { value: 'password123' } })

  // 触发提交
  fireEvent.click(screen.getByRole('button', { name: /注册/i }))

  // 断言Supabase的signUp方法被调用
  const { createClientComponentClient } = require('@supabase/auth-helpers-nextjs')
  const mockSupabase = createClientComponentClient()
  expect(mockSupabase.auth.signUp).toHaveBeenCalledWith({
    email: 'test@example.com',
    password: 'password123',
  })
})

3. 排查额外转译问题

如果仍报错,在jest.config.js的transformIgnorePatterns里排除Supabase相关包,确保Jest能转译它们:

const customJestConfig = {
  // ...其他配置
  transformIgnorePatterns: [
    '/node_modules/(?!@supabase/auth-helpers-nextjs|@supabase/supabase-js)',
  ],
}

这样就能让Jest正确解析Supabase模块,同时Mock客户端创建逻辑,顺利测试组件的渲染和提交功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:20:15