【发布时间】:2019-01-18 07:06:48
【问题描述】:
我已经成功地为我的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) 测试。
测试/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);
如果我理解正确,这个 sn-p 会遍历源目录中的所有索引文件并从中导入所有内容。我的问题是:如何正确地将这个 sn-p 翻译成 Typescript?还是有不需要import * from * 解决方法的更好的解决方案?
编辑
我发现了这个问题:Typescript 1.8 modules: import all files from folder。这是否意味着我需要一个 index.ts 文件来导入每个模块?这意味着每次我引入一个新的模块文件时,我都必须手动将其导入添加到index.ts?一定有更好的办法。
编辑 2
我也对其他可以为整个代码库生成覆盖率报告的工具持开放态度,这是它们能够应对 Typescript + Webpack + Karma + Mocha 堆栈的唯一条件。我试过nyc,但根本无法获得任何代码覆盖率。
编辑 3
这是上面翻译成 Typescript 的 index.js:
declare const require: any;
const ctx = require.context('../src', true, /\.ts$/);
ctx.keys().map(ctx);
编辑 4
现在有一个名为 karma-sabarivka-reporter 的 karma 插件可以更正覆盖率统计信息。详情请查看accepted answer。
【问题讨论】:
-
也许只是为你的所有文件添加测试用例,然后在那些你不想测试的文件中进行描述。无论如何,您尝试实现的目标听起来有点反模式,从某种意义上说,您应该只关心您的测试结果。
-
我不认为实现真正的代码覆盖率算作反模式,这就是React devs 代码覆盖率与uncovered source files included 的样子。实际上,这让我想到了尝试用 Jest 替换 Karma 的想法。
-
我个人强烈推荐 Jest。它使用起来非常直观,基本上是
no configuration needed设置。我还使用 Jest 收集了我的 React 翻译组件的测试覆盖率,效果很好。您可能还想查看 Airbnb/Enzyme,它公开了一些更易于使用的测试功能。 -
模式是编写每个组件规范测试,并基于 karma 配置文件,webpack 应该接受 /src 和 /tests 下的所有测试。我试过你的回购,它按预期工作。
标签: javascript typescript webpack karma-runner