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

Next.js中Jest结合Firebase模拟器测试遇import语法错误求助

解决Next.js中Jest测试Firebase时的ESM模块语法错误

问题原因

Jest默认采用CommonJS模块系统,而当前Firebase官方npm包为纯ESM格式,直接导入会触发SyntaxError: Cannot use import statement outside a module错误。

解决方案

1. 修改Jest配置,允许转译Firebase相关包

编辑项目根目录的jest.config.js,添加transformIgnorePatterns配置,让Jest转译node_modules中的Firebase相关包:

const nextJest = require('next/jest')

const createJestConfig = nextJest({
  dir: './',
})

const customJestConfig = {
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1', // 根据你的路径别名调整
  },
  // 关键配置:排除Firebase相关包,让Babel转译它们
  transformIgnorePatterns: [
    '/node_modules/(?!firebase|@firebase|firebase-admin)/',
  ],
  testEnvironment: 'jest-environment-jsdom',
}

module.exports = createJestConfig(customJestConfig)

2. 修正Firebase模拟器初始化逻辑

不要在describe顶层调用模拟器连接方法,建议在beforeAll中初始化模拟器,并在beforeEach中清空数据保证测试隔离:

import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
import { firestore } from '../src/lib/firebase';
import { connectFirestoreEmulator, clearFirestoreData } from 'firebase/firestore';

describe('Example', () => {
  beforeAll(() => {
    // 连接Firestore模拟器
    connectFirestoreEmulator(firestore, 'localhost', 8080);
  });

  beforeEach(async () => {
    // 每次测试前清空模拟器数据,避免测试污染
    await clearFirestoreData({ projectId: '你的测试项目ID' });
  });

  it('example test', () => {
    render(<div>Hello</div>);
    const heading = screen.getByText('Hello');
    expect(heading).toBeInTheDocument();
  });
});

3. GitHub Actions配置(自动运行带模拟器的测试)

在.github/workflows/test.yml中添加以下配置,实现自动启动模拟器并运行测试:

name: Run Tests with Firebase Emulator

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - name: Install Dependencies
        run: npm ci
      - name: Install Firebase CLI
        run: npm install -g firebase-tools
      - name: Start Firebase Emulator & Run Tests
        run: |
          # 后台启动Firestore模拟器
          firebase emulators:start --only firestore --export-on-exit ./emulator-data &
          # 等待模拟器完全启动(可根据实际情况调整等待时间)
          sleep 10
          # 运行Jest测试
          npm run test

注意事项

  • 确保Firebase初始化时使用的项目ID与模拟器配置的项目ID一致
  • 若使用Next.js 13+ App Router,Jest配置无需额外调整,上述配置已兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:34