这是一个使用 jest 进行测试的 nextjs 项目。我添加了
next-auth
库,当测试套件针对导入 import { signIn, signOut, useSession } from 'next-auth/react'
的文件运行时,我的测试失败了
这是错误消息:
Details:
/node_modules/next-auth/react.js:10
import { jsx as _jsx } from "react/jsx-runtime";
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1505:14)
at Object.<anonymous> (src/shared/components/header.tsx:1767:27)
at Object.<anonymous> (src/shared/components/header.test.tsx:22:56)
我假设这是一个 jest.config.js 问题,我的配置如下:
import nextJest from 'next/jest';
import type { Config } from 'jest';
const createJestConfig = nextJest({
dir: './',
});
const config: Config = {
clearMocks: true,
collectCoverage: true,
collectCoverageFrom: ['src/**/*.ts', 'src/**/*.tsx'],
coverageDirectory: 'coverage',
coveragePathIgnorePatterns: [
'node_modules',
'qsrkit',
'_redux',
'shared/utils',
'layout',
'page.tsx',
],
moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json', 'node'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@/app/(.*)$': '<rootDir>/src/app/$1',
'^@/shared/(.*)$': '<rootDir>/src/shared/$1',
'^@/icons/(.*)$': '<rootDir>/src/shared/assets/icons/$1',
'^@/utils/(.*)$': '<rootDir>/src/shared/utils/$1',
},
preset: 'ts-jest',
reporters: ['default', 'jest-junit'],
roots: ['<rootDir>'],
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
testEnvironment: 'jsdom',
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
testPathIgnorePatterns: ['/node_modules/', '/playwright/'],
watchPathIgnorePatterns: ['/node_modules/', '/playwright/'],
modulePathIgnorePatterns: ['/node_modules/', '/playwright/'],
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
};
export default createJestConfig(config);
我想既然我已经忽略了
/node_modules/
,这不会被抓住,但显然这是行不通的。
Jest 默认使用 CommonJS 环境,因此不允许使用 import 语句。使用 require 代替