node.js - Köra mocha med Typescript ger: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Okänd filändelse ".ts"
Jag försöker skriva några tester med Typescript och Mocha.
Följande dess dokumentation slutade jag upp med följande uppsättning:
package.json
{
//...
"scripts": {
"test": "mocha",
},
//...
}
.mocharc.json
{
"extension": ["test.ts"],
"spec": "tests/*.test.ts",
"require": "ts-node/register",
"recursive": true
}
tsconfig.json
{
"compilerOptions": {
"outDir": "dist",
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": false,
"strict": true,
"esModuleInterop": true,
"isolatedModules": true,
},
"files": [
"src/main/main.ts",
],
}
Att köra npm test ger följande fel: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Okänd filändelse ".ts" för [...]/tests/task.test.ts.
Det är mitt enda test, och det fungerar tills jag importerar en separat .ts-fil (../src/core/task), för fullständighetens skull:
task.test.ts
import { assert } from 'chai';
import { Task } from '../src/core/task';
describe('Task', () => {
it('Task Run', () => {
const task = new Task({
title: "My Title",
command: "echo hello",
path: "."
});
task.run();
})
});
Jag har försökt flera varianter av min konfiguration enligt några andra svar samt ts-mocha utan framgång.
Svar #1
Jag hade samma problem tidigare, det fungerade i ts-node@9 men inte i ts-node@10 och sedan försökte jag denna konfiguration i .mocharc.json för att få det att fungera som förväntat
{
"extensions": ["ts"],
"spec": ["**/*.spec.*"],
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"
]
}
Svar #2
I mitt fall orsakades problemet av en import i en JS-fil som importerades av TypeScript-testfiler. Att omvandla det till en require löste problemet.
Allmänt sett, när undantaget inträffar i:
Loader.defaultGetFormat [as _getFormat] internal/modules/esm/get_format.jsDet kan bara finnas en förklaring: Node.js använder sin ESM-laddare för att ladda det som borde vara kod transpilerad av ts-node.
Så lösningen bör alltid vara - hitta anledningen till att Node.js byter till ESM och eliminera den.
