获取nyc/istanbul覆盖率报告以使用打字稿 [英] getting nyc/istanbul coverage report to work with typescript
问题描述
我正在努力为我的Typescript/mocha/gulp项目获得nyc/istanbul的适当报道.我尝试了许多方法,其中一些方法似乎无法使用源映射,而其他方法则由于ts-node
/tsc
错误而失败.我当前的设置是:
nyc
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.js
mocha
相关部分
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
}
}
使用上述设置覆盖率会生成所有文件的结果,但对于TS文件而言,结果不正确,很可能是由于未使用源映射(即,报告未覆盖注释行,并且数字似乎也有误) ).
尝试了许多没有成功的变体方法,最常见的建议之一是将"require": ["ts-node/register"]
添加到nyc
配置,但是然后我却抱怨说错误,例如gulpfile.js
,docs/reports/coverage/lcov-report/prettify.js
和数量其他JS文件为not under 'rootDir'
,这是正确的,但尚不清楚为什么ts-node
尝试处理src
中的所有文件,即使它们已被排除在tsconfig.json
中(配置仍然非常复杂). /p>
我会很高兴提出任何建议以哪种方式为TS文件获取正确的覆盖率报告.
最近,我在tsconfig.json
的compilerOptions
中使用"target": "es6"
而不是es5
找到了令人满意的解决方案.虽然在tsconfig.json
中直接更改target
可能不是一个选择,因为它会影响构建,但另一个技巧是使用TS_NODE_COMPILER_OPTIONS='{"target":"es6"}
,可以直接将其添加到package.json
scripts
中,例如:
"test:coverage": "TS_NODE_COMPILER_OPTIONS='{\"target\":\"es6\"}' nyc npm run test:unit",
其中,test:unit
是用于运行实际测试的任何方式(在我的情况下,仅为gulp mocha
.
注意:我还按照ts-node
更新到了3.3.0
. rel ="noreferrer"> https://github.com/istanbuljs/nyc/issues/618 线程
I'm struggling to get proper coverage with nyc/istanbul for my typescript/mocha/gulp project. I've tried a number of approaches, some of them seem to be unable to use source maps and other fails due to ts-node
/tsc
errors. My current setup is:
nyc
relevant config in 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.js
mocha
relevant part
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
}
}
With the above setup coverage produces results for all the files but they are incorrect for TS files most probably due to source maps not being used (i.e. report shows no coverage for lines which are comments and the numbers seems to be wrong as well).
With a number of variant approaches tried with no success one of the most commonly suggested is to add "require": ["ts-node/register"]
to nyc
configuration yet then I'm getting errors complaining about i.e. gulpfile.js
, docs/reports/coverage/lcov-report/prettify.js
and number of other JS files to be not under 'rootDir'
which is correct yet it is not clear why ts-node
tries to process all the files out of src
even if they are excluded in tsconfig.json
(still the configuration gets really complex).
I'll appreciate any suggestion which way to go to get proper coverage report for TS files.
Recently I found a satisfiable solution by using "target": "es6"
instead of es5
in tsconfig.json
's compilerOptions
. While changing target
directly in tsconfig.json
may not be an option as it affects build, the other tip is to use TS_NODE_COMPILER_OPTIONS='{"target":"es6"}
which can be added directly in package.json
scripts
as i.e. :
"test:coverage": "TS_NODE_COMPILER_OPTIONS='{\"target\":\"es6\"}' nyc npm run test:unit",
where test:unit
is whatever way being used to run actual tests (in my case just gulp mocha
.
NOTE: I've also updated nyc
to latest 11.1.0 and ts-node
to 3.3.0
as suggested on https://github.com/istanbuljs/nyc/issues/618 thread
这篇关于获取nyc/istanbul覆盖率报告以使用打字稿的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!