我已经成功地为sandbox project written in Typescript使用Karma和Webpack进行了测试。代码覆盖率指标由Istanbul Instrumenter Loader收集。令我困扰的是I get the coverage reported only for the modules that are being imported in the tests,所以报道的100%的报道实际上是一个卑鄙的谎言。
在寻找解决方案时,我在Istanbul Instrumenter Loader的readme中找到了一段话:
要为所有组件(甚至还没有测试的组件)创建代码覆盖率报告,您必须要求所有1)源和2)测试。
test / index.js
// requires all tests in `project/test/src/components/**/index.js` const tests = require.context('./src/components/', true, /index\.js$/); tests.keys().forEach(tests); // requires all components in `project/src/components/**/index.js` const components = require.context('../src/components/', true, /index\.js$/); components.keys().forEach(components);
如果我理解正确,此代码段将遍历源目录中的所有索引文件并从中导入所有内容。我的问题是:如何正确将此代码段转换为Typescript?还是有不需要import * from *
解决方法的更好解决方案?
我发现了这个问题:Typescript 1.8 modules: import all files from folder。这是否意味着我需要在其中导入每个模块的index.ts
文件?这意味着每次我引入一个新的模块文件时,都必须手动将其导入添加到index.ts
吗?必须有更好的方法。
我也向其他工具开放,这些工具可以为整个代码库生成覆盖率报告,这是它们能够处理Typescript + Webpack + Karma + Mocha堆栈的唯一条件。我已经尝试过nyc,但根本无法获得任何代码覆盖。
答案 0 :(得分:3)
此答案不能解决上述问题,这是根本错误的。查看评论。
NYC支持使用--all
标志覆盖未经测试的代码。假设您在test
中的package.json
命令是
"test": "karma start karma.conf.js",
您可以在npm install -D nyc ts-node
之后测试覆盖率,可以添加以下命令并运行它。此命令希望源代码检查覆盖范围在src
目录中。
"coverage": "nyc --all --include src --extension .ts --require ts-node/register npm test",
--all
标志用于检查所有文件的覆盖率。--extension .ts
用于检查所有TypeScript文件,您可以添加更多扩展名,例如--extension .ts --extension .tsx
。--include src
用于目录检查覆盖范围。-- require ts-node/register
是要教NYC了解TypeScript。 之后,您应该会看到所有.ts文件都包含在内。
注意:使用ts-node/register
可能会导致报告中的行号出现问题。为了解决这个问题,您可能还需要注册source map support。
答案 1 :(得分:1)
对于使用Karma + Istanbul作为覆盖率报告程序测试的项目–我刚刚创建了karma插件,该插件将项目中的所有文件添加到coverage统计信息-https://github.com/kopach/karma-sabarivka-reporter中。
要使用它->安装npm install --save-dev karma-sabarivka-reporter
并像这样更新karma.conf.js
:
reporters: [
// ...
'sabarivka'
// ...
],
coverageReporter: {
include: 'src/**/!(*.spec|*.module|environment*).ts', // glob patter which matchs all the files you want to be included into the coverage result
exclude: 'src/main.ts',
// ...
},