web-dev-qa-db-fra.com

Comment exécuter des tests Mocha écrits en TypeScript?

Configuration: J'ai un projet Node (Node pur, pas de bits de navigateur) écrit en TypeScript. Je peux utiliser le compilateur TypeScript (tsc) à partir du TypeScript module pour compiler le code. Jusqu'ici tout va bien.

Cependant, je veux écrire des tests en utilisant Mocha, et c'est là que j'ai du mal. J'ai essayé --compilers ts:TypeScript, mais je reçois toujours des erreurs comme:

error TS5023: Unknown compiler option 'compilers'.

Il semble que la ligne de commande de mocha finit par être passée à tsc, ce qui n'est évidemment pas bon.

32
Thomas

Pour toute personne qui a essayé et a eu des problèmes avec nécessite TypeScript , vous pouvez essayer ts-node .

$ npm install -g ts-node
$ mocha test.ts --require ts-node/register src/**/*.spec.ts

Il semble également qu'il y ait eu discussion en cours sur la dépréciation de TypeScript-require en faveur de ts-node.

47
jpierson

N'utilisez pas cette réponse. TypeScript-require n'est pas maintenu, et ts-node est son remplacement. Laissez cette réponse ici pour la postérité.

Je l'ai trouvé. Le module TypeScript est en fait comme une fonction "principale"; il exécute le compilateur dès que le module est chargé. Design pas très sympa.

J'ai fouillé les tests d'acceptation de Mocha, qui montrent comment utiliser un compilateur personnalisé pour les fichiers foo. Ils le câblent via le require.extensions mécanisme. J'étais à mi-chemin de l'écriture d'un module qui appelle simplement tsc sur la ligne de commande lorsque j'ai réalisé que quelqu'un devait avoir fait cela auparavant. C'est donc très simple:

$ npm install TypeScript-require --save-dev
$ mocha --compilers ts:TypeScript-require
10
Thomas

En utilisant la dernière version de Mocha et ts-node je recevais un Problème d'importation de jeton inattendu . L'utilisation des paramètres ci-dessous avec ts-mocha a fonctionné pour moi:

tsconfig.json

{
    "files": [
        "src/main.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es2015",
        "types": ["mocha"],
        "module": "commonjs"
    }
}

package.json

"scripts": {
    "mocha": "ts-mocha -p library/tsconfig.json library/test/**/*.ts"
  },

launch.json

{
    "type": "node",
    "request": "launch",
    "name": "Mocha Tests",
    "runtimeArgs": [
        "${workspaceFolder}/node_modules/ts-mocha/bin/ts-mocha",
        "--timeout", "999999",
        "-p",
        "${workspaceFolder}/library/tsconfig.json",
        "${workspaceFolder}/library/test/**/*.ts"
    ],
    "internalConsoleOptions": "openOnSessionStart"
}

et gulp.js au cas où vous voudriez aussi utiliser gulp

const gulp = require('gulp');
const ts = require('gulp-TypeScript');
const mocha = require('gulp-mocha');

const tsProject = ts.createProject('tsconfig.json');

gulp.task('build', () => tsProject.src()
  .pipe(tsProject())
  .js.pipe(gulp.dest('dist')));

gulp.task('test', () => gulp.src('test/*.spec.ts')
  .pipe(mocha({
    reporter: 'nyan',
    require: ['ts-node/register'],
  })));
/* single command to hook into VS Code */
gulp.task('default', gulp.series('build', 'test'));
0
ToDevAndBeyond