2017-06-22 1 views
2

J'ai du mal à obtenir une couverture adéquate avec nyc/istanbul pour mon projet de typecript/moka/gulp. J'ai essayé un certain nombre d'approches, certains d'entre eux semblent être incapables d'utiliser des cartes sources et d'autres échoue en raison d'erreurs ts-node/tsc. Ma configuration actuelle est:Obtenir le rapport de couverture nyc/istanbul pour travailler avec tapuscrit

nyc config pertinente dans package.json

"scripts": { 
    "test:coverage": "nyc npm run test:unit", 
    "test:unit": "gulp mocha" 
} 
"nyc": { 
    "check-coverage": true, 
    "all": true, 
    "extension": [ 
     ".js", 
     ".jsx", 
     ".ts", 
     ".tsx" 
    ], 
    "include": [ 
     "src/**/!(*.test.*).[tj]s?(x)" 
    ], 
    "reporter": [ 
     "html", 
     "lcov", 
     "text", 
     "text-summary" 
    ], 
    "report-dir": "docs/reports/coverage" 
    } 

gulpfile.jsmocha partie pertinente

const SRC_DIR = path.join(__dirname, 'src'); 
const SRC_FILES = path.join(SRC_DIR, '**', '*.[jt]s?(x)'); 
const TEST_FILES = path.join(SRC_DIR, '**', '*.test.[jt]s?(x)'); 
const MOCHA_CONFIG = { 
    src: [ 
     TEST_FILES 
    ], 
    watchSrc: [ 
     SRC_FILES, 
     TEST_FILES 
    ], 
    mocha: { 
     // compilers: [ 
     //  'ts:ts-node/register', 
     //  'tsx:ts-node/register' 
     // ], 
     require: [ 
      './tests/setup.js', 
      'ignore-styles', 
      'source-map-support/register' 
     ] 
    } 
}; 
gulp.task('mocha', mocha(MOCHA_CONFIG)); 

tsconfig.json

{ 
    "compilerOptions": { 
    "baseUrl": "./", 
    "rootDir": "./src", 
    "outDir": "./build", 
    "allowJs": true, 
    "module": "commonjs", 
    "target": "es5", 
    "lib": ["es5", "es6", "dom"], 
    "sourceMap": true, 
    "inlineSourceMap": false, 
    "inlineSources": false, 
    "experimentalDecorators": true, 
    "noUnusedParameters": true, 
    "noUnusedLocals": true, 
    "jsx": "react", 
    "moduleResolution": "node" 
    }, 
    "exclude": [ 
    "docs", 
    "tests", 
    "**/*.test.js", 
    "**/*.test.jsx", 
    "**/*.test.ts", 
    "**/*.test.tsx", 
    "tools", 
    "gulpfile.js", 
    "node_modules", 
    "build", 
    "typings/main", 
    "typings/main.d.ts" 
    ], 
    "awesomeTypescriptLoaderOptions": { 
    "useCache": true, 
    "useBabel": true 
    } 
} 

Avec la couverture configuration ci-dessus produc es résultats pour tous les fichiers, mais ils sont incorrects pour les fichiers TS, probablement parce que les cartes sources ne sont pas utilisées (c.-à-d. le rapport ne montre aucune couverture pour les lignes qui sont des commentaires et les chiffres semblent également faux).

Avec un certain nombre de variantes approches ont essayé sans succès l'un des plus couramment proposée consiste à ajouter encore la configuration "require": ["ts-node/register"]-nyc je reçois des erreurs se plaignent-à-dire gulpfile.js, docs/reports/coverage/lcov-report/prettify.js et d'autres fichiers JS à être not under 'rootDir' qui est correct mais il n'est pas clair pourquoi ts-node essaie de traiter tous les fichiers sur src même s'ils sont exclus dans tsconfig.json (encore la configuration devient vraiment complexe).

J'apprécierai toute suggestion de chemin à faire pour obtenir un rapport de couverture approprié pour les fichiers TS.

+0

La mise en place de tests corrects avec couverture peut parfois être fastidieuse. J'ai arrêté d'utiliser Mocha/Istanbul pour les projets React-Typescript et je suis passé à Jest et ts-jest (https://github.com/kulshekhar/ts-jest), qui est fourni avec Istanbul et tous les goodies nécessaires pour les tests React. C'est pour moi une pile stable à travers différentes versions. –

+0

Merci de suggestion! Alors qu'en fait c'est l'une de mes considérations, ai-je raison de dire qu'il faudra peut-être réécrire puisque 'jest' diffère de' mocha'? – ciekawy

+0

Les tests de moka sont facilement réécrits en plaisanterie. Supprimez les sections de description et remplacez-la() par test(). Les assertions sont également différentes. Mais les sections avant * et après * sont les mêmes. Prend un peu de temps, mais c'est long ... –

Répondre

3

Récemment, je trouve une solution satisfiable en utilisant "target": "es6" au lieu de es5 dans l » compilerOptionstsconfig.json. Tout en changeant target directement dans tsconfig.json ne peut pas être une option car elle affecte la construction, l'autre astuce consiste à utiliser TS_NODE_COMPILER_OPTIONS='{"target":"es6"} qui peut être ajouté directement dans package.jsonscripts comme par exemple:

"test:coverage": "TS_NODE_COMPILER_OPTIONS='{\"target\":\"es6\"}' nyc npm run test:unit", 

test:unit est quelque manière être utilisé pour exécuter . Les tests réels (dans mon cas, juste gulp mocha

NOTE: Je suis aussi mis à jour nyc à la dernière 11.1.0 et ts-node à 3.3.0 comme suggéré sur https://github.com/istanbuljs/nyc/issues/618 fil