![](/img/trans.png)
[英]ts-node TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"
[英]Why does jest throw an ERR_UNKNOWN_FILE_EXTENSION when trying to use a ts file as custom testEnvironment?
我正在将我的 TypeScript 项目切换到 (pnpm) monorepo,并且无法让测试正常运行。 我有一个 jest.config.js,它使用了一个用 TypeScript 编写的自定义testEnvironment
。 但是,自从我将特定项目移动到我的包目录中以进行 monorepo 重组后,jest 抛出一个错误并且不运行任何测试:
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for C:\workspaces\repos\the-monorepo\packages\testproject\source\testtools\jsdom-environment-global.spec.ts
我用@swc/jest 和 ts-jest 试过了,看看How to use TypeScript in a Custom Test Environment file in Jest? (这让我想“为什么这会奏效?”)而且,无论出于何种原因,它昨天运行良好。 我清理了 jest 缓存并重新安装了所有 node_modules 无济于事。 我还在 package.json 中找到了与"type": "module"
相关的答案,但这不适用于我的包。 这不是 ESM。
这是 jest.config.js 的样子:
/** @type {import('@jest/types').Config.InitialOptions} */
const config = {
silent: true,
testEnvironment: "<rootDir>/source/testtools/jsdom-environment-global.spec.ts",
roots: [
"<rootDir>/source"
],
maxWorkers: "50%",
transform: {
"^.+\\.(t|j)s$": ["@swc/jest", {
sourceMaps: "inline",
module: {
strict: false,
strictMode: false
},
jsc: {
target: "es2021",
parser: {
syntax: "typescript",
dynamicImport: true
}
}
}]
},
transformIgnorePatterns: [
"node_modules"
],
testMatch: [
"**/*/*.spec.ts",
"**/*/*.test.ts",
"!**/playwright-tests/**",
"!**/playwright-tests-smoke/**"
],
moduleFileExtensions: ["ts", "js", "node", "json"],
reporters: [
"default"
],
globals: {
self: {},
navigator: {},
jasmine: {},
__UNIT__: true
},
coverageDirectory: "test-results",
collectCoverage: false,
collectCoverageFrom: [
"./source/**/*.ts"
],
coveragePathIgnorePatterns: [
"/\\.spec\\.ts$/i",
"/.*node_modules.*/",
"/.*testtools.*/"
],
coverageReporters: [
"lcov", "cobertura"
],
coverageProvider: "v8",
resetMocks: true,
restoreMocks: true,
resetModules: true,
setupFilesAfterEnv: [
"jest-extended/all",
"<rootDir>/source/testtools/setup.spec.ts"
],
testPathIgnorePatterns: [
"<rootDir>/source/testtools/",
"<rootDir>/source/smoke-tests/",
"<rootDir>/source/performance-tests/",
"<rooDir>/source/playwright-tests/",
"<rooDir>/source/playwright-tests-smoke/"
],
moduleNameMapper: {
"^@test-helpers": "<rootDir>/source/testtools/index.spec.ts",
"^@test-tools/(.*)": "<rootDir>/source/testtools/$1",
'^(\\.{1,2}/.*)\\.js$': '$1'
}
};
module.exports = config;
如果它是 TypeScript 文件,为什么 jest 无法解析testEnvironment
?
我发现了问题:未将转换器应用于 ESM 文件似乎有些混乱。 在我的例子中, jsdom-environment-global.spec.ts
从我的 monorepo 中的不同包中导入了一个 ESM 模块。 这个导入触发了一个异常,因为 jest tris 通过require()
导入它,它被捕获,然后通过动态导入再次导入。 这个动态导入然后抛出ts
是未知异常的异常。 我不确定为什么这些文件没有被转换,但是关于How to use TypeScript in a Custom Test Environment file in Jest? 这似乎很正常。
底线:不要从您开玩笑的testEnvironment
模块中的 ESM 文件导入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.