javascript - Vad är den korrekta inställningen för att stödja es6-moduler?
Jag har skapat en app med create-react-app och lagt till TypeScript. Efter att ha slutfört appmodulerna ville jag göra några enhetstester och jag har installerat mocha och chai: npm install --save-dev mocha chai.
i min package.json har jag uppdaterat testskriptet till "test": "mocha src/test/*". Efter att ha använt en import i min testfil
import {assert} from 'chai'
import {File} from "../components/File"
Jag stöter på ett problem
import {assert} from 'chai'
^^^^^^
SyntaxError: Cannot use import statement outside a module
Jag har sökt mycket och provat massor av svar som detta men stöter fortfarande på samma problem -_- Och jag är förvirrad över om jag behöver installera babel? Här är min package.json någon förklaring
{
...
"dependencies": {
"@testing-library/jest-dom": "^5.11.9",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^12.8.3",
"@types/classnames": "^2.2.11",
"@types/jest": "^26.0.22",
"@types/node": "^14.14.37",
"@types/react": "^17.0.3",
"@types/react-dom": "^17.0.3",
"classnames": "^2.2.6",
"node-sass": "^5.0.0",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-scripts": "4.0.3",
"typescript": "^4.2.3",
"web-vitals": "^1.1.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "cross-env TS_NODE_PROJECT=\"tsconfig.testing.json\" mocha src/test/*",
"eject": "react-scripts eject"
},
...
"devDependencies": {
"@types/chai": "^4.2.16",
"@types/mocha": "^8.2.2",
"chai": "^4.3.4",
"cross-env": "^7.0.3",
"mocha": "^8.3.2"
}
}
Här är min tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": [
"src"
]
}
Hur kunde jag ställa in allt korrekt?
Svar #1
Det finns 02 alternativ
- använder
ts-mochapå det korta sättet =>npm install --save-dev ts-mocha
Mocha-tunn wrapper som gör det möjligt att köra TypeScript-tester med TypeScript-runtime (ts-node) för att bli av med kompilationskomplexiteten. Alla Mocha-funktioner är tillgängliga utan några begränsningar. Se dokumentationen.
använd denna ts-konfiguration för testet tsconfig.testing.json.
{
"compilerOptions": {
"module": "commonjs",
"target": "es5"
},
"include": ["src/test/*"]
}
Detta är en grundläggande konfiguration som du kan uppdatera enligt ditt behov
Lägg till skript i package.json skript: "test-ts": "ts-mocha -p tsconfig.testing.json src/test/*"
Du bör vara uppmärksam på att importera textfiler som kan orsaka problem. Det kommer att leda till tokenfel, så flytta dem till andra filer och se till att dina
utils-funktioner är rena funktioner eftersom du kör enhetstester.
En annan viktig notering: Du bör ställa in
"module": "commonjs"för att åtgärda konfliktproblem, som dittCannot use import statement outside a module.
- använd vanlig
mochamedts-node/registerför TypeScript-exekvering. Kolla dokumentationen
- du bör installera
ts-nodeochcross-envför att använda den nyatsconfig.testing.json. - Detta är en enkel konfiguration för
tsconfig.testing.json. Observera att du bör lägga tillmoduleResolutionsomnodei ovanstående konfiguration. Kolla här för mer information. Lägg till sökvägen till dina deklarationstyper om det finns några för att undvika fel av typenerror TS2304: Cannot find name "type_name". - Lägg till skript i
package.jsonskript:cross-env TS_NODE_PROJECT=\"tsconfig.testing.json\" mocha -r ts-node/register src/test/*
{
"ts-node": {
"files": true
},
"compilerOptions": {
"target": "es5",
"module": "CommonJS",
"moduleResolution": "node"
},
"include": [
"src"
],
"exclude": [
"./node_modules/",
"./dist/"
],
"files": [
"path_to_your_types_declaration"
]
}
