获取nyc/istanbul覆盖率报告以使用打字稿

cie*_*awy 10 javascript mocha.js typescript istanbul tsconfig

我正在努力为我的打字稿/ 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"
  }
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

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
  }
}
Run Code Online (Sandbox Code Playgroud)

使用上面的设置覆盖产生所有文件的结果,但它们对于TS文件是不正确的,这很可能是由于源地图未被使用(即报告显示没有覆盖作为注释的行并且数字似乎也是错误的).

尝试了许多变种方法没有成功,最常见的建议之一是添加"require": ["ts-node/register"]nyc配置然后我得到错误抱怨ie gulpfile.js,docs/reports/coverage/lcov-report/prettify.js和其他JS文件的数量not under 'rootDir'是正确的但是不清楚为什么ts-node尝试处理所有文件,src即使它们被排除在外tsconfig.json(仍然配置变得非常复杂).

我将不胜感激任何建议,以获得适当的TS文件覆盖率报告.

cie*_*awy 7

最近,我利用找到了一个令人满意的解决方案"target": "es6",而不是es5tsconfig.jsoncompilerOptions。虽然target直接更改tsconfig.json可能不是一个选择,因为它会影响构建,但另一个技巧是使用TS_NODE_COMPILER_OPTIONS='{"target":"es6"},它可以直接添加package.json scripts为:

"test:coverage": "TS_NODE_COMPILER_OPTIONS='{\"target\":\"es6\"}' nyc npm run test:unit",
Run Code Online (Sandbox Code Playgroud)

test:unit什么地方可以用什么方式进行实际测试(就我而言)gulp mocha

注:我也更新nyc到最新的11.1.0和ts-node3.3.0上的建议https://github.com/istanbuljs/nyc/issues/618线