TypeScript/mocha/gulpプロジェクトでnyc/istanbulを適切にカバーするのに苦労しています。いくつかのアプローチを試しましたが、ソースマップを使用できないものもあれば、ts-node
/tsc
エラーが原因で失敗するものもあります。私の現在の設定は次のとおりです。
package.json
のnyc
関連する構成
"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ファイルでは正しくありません(つまり、レポートにはコメントである行のカバレッジが表示されず、番号も間違っているようです)。
いくつかのバリアントアプローチが試みられましたが成功しませんでしたが、最も一般的に提案されたものの1つは、"require": ["ts-node/register"]
をnyc
構成に追加することですが、それでもgulpfile.js
、docs/reports/coverage/lcov-report/prettify.js
およびnumber他のJSファイルのnot under 'rootDir'
は正しいですが、ts-node
で除外されている場合でもtsconfig.json
がsrc
からすべてのファイルを処理しようとする理由は明らかではありません(構成は本当に複雑です)。
TSファイルの適切なカバレッジレポートを取得するための方法についての提案をいただければ幸いです。
最近、"target": "es6"
のcompilerOptions
でes5
の代わりにtsconfig.json
を使用することで充足可能な解決策を見つけました。 tsconfig.json
でtarget
を直接変更することは、ビルドに影響するためオプションではない場合がありますが、もう1つのヒントは、TS_NODE_COMPILER_OPTIONS='{"target":"es6"}
scripts
に直接追加できるpackage.json
を使用することです。
"test:coverage": "TS_NODE_COMPILER_OPTIONS='{\"target\":\"es6\"}' nyc npm run test:unit",
ここで、test:unit
は、実際のテストを実行するために使用される方法です(私の場合はgulp mocha
だけです。
注: https://github.com/istanbuljs/nyc/issues/618 スレッドで提案されているように、nyc
を最新の11.1.0に、ts-node
を3.3.0
に更新しました。
これが同じ問題かどうかはわかりませんが、将来の開発者に役立つ場合に備えて、ここに配置します...
exclude-after-remap=false
のnycセクションにpackage.json
を追加するまで、カバレッジデータを取得していませんでした。
これは ドキュメントに と記載されていますが、あまり目立つ方法ではありません(IMO)。