Tratando de averiguar por qué no obtengo cobertura de nyc , terminé con un archivo único ./x.js que solo contiene
#!/usr/bin/env node 'use strict' console.log('======= starting tests ======='); En package.json tengo
... "scripts": { "test": "nyc ./x.js", } ... y cuando ejecuto npm run test obtengo lo siguiente
De todos los ejemplos en la red, asumí que la instrumentación se realiza sobre la marcha y que el nyc instrument es más bien para casos de usos especiales. ¿Alguien puede proporcionar algo dentro de lo que está pasando y qué no? Aquí está (una de las tropecientos versiones de) la configuración que probé:
{ "cache": true, "cache-dir": "./kkk", "instrument": true, "extension": [ ".ts", ".js" ], "include": [ "**/x.js" ], "reporter": [ "html" ], "all": true } Comienzo a obtener resultados de cobertura cuando no uso "type": "module" en mi package.json .
Versiones :
El problema parece ser que nyc , de hecho, no puede cargar módulos es (ESM) sobre la marcha. Una posible solución podría haber sido
npm i -D @istanbuljs/esm-loader-hook NODE_OPTIONS='--experimental-loader @istanbuljs/esm-loader-hook' ./node_modules/.bin/nyc ..more options.. ./x.jsde acuerdo con este repositorio de github . Sin embargo, esto no funcionó para mí, probablemente porque la versión de mi nodo (16.13.2) es demasiado nueva, como se prometió en ese sitio.
El enlace anterior apunta a c8 como una solución. Se pueden encontrar algunos antecedentes en el blog del desarrollador de c8 . En pocas palabras: los módulos es fueron difíciles de implementar para istanbul , así que use una nueva función de node para recopilar datos de cobertura y "simplemente" conviértalos a una forma legible por humanos: c8.
Funciona para mí, dado el archivo de ejemplo en la pregunta,
./node_modules/.bin/c8 node ./x.js produce la salida de cobertura esperada. Además, noté que cuando se incluye un archivo .js que fue producido por el compilador TypeScript con "sourceMap": true , la cobertura muestra muy bien el archivo .ts .