我有一个 TypeScript 项目,它使用 Visual Studio 的“将 JavaScript 输出合并到文件中”选项来创建一个包含我的所有应用程序代码(不包括库)的 .js
文件。我正在使用Chutzpah Test Adapter集成并运行 Jasmine 单元测试。如果我在没有测试的情况下运行代码覆盖率分析,该工具会报告我的测试覆盖率是 23%:
是什么导致了这一夸大的统计数据?
我当前的理论是,当 Chutzpah 运行我的代码 (app.js
) 以便定义测试中使用的所有类时,blanket.js (Chutzpah 在后台使用它来获取代码覆盖率统计信息)看到这些行正在运行并将它们计为“覆盖行”。
是否有一种方法可以仅将测试期间(而不是测试之前,出于设置目的)命中的行包含在最终的代码覆盖率统计中?或者这个夸大的数字是由其他原因造成的?
这是我的 chutzpah.json
:
{
"Compile": {
"Extensions": [ ".ts" ],
"ExtensionsWithNoOutput": [ ".d.ts" ],
"Mode": "External"
},
"References": [
{ "Path": "initialize.js" },
{ "Path": "./MyApp/lib/jquery-1.11.2.min.js" },
{ "Path": "./MyApp/lib/jquery-ui.min.js" },
{ "Path": "./MyApp/lib/knockout-3.3.0.js" },
/* other references here.... */
{ "Path": "./MyApp/app.js" }
],
"Tests": [
{ "Includes": [ "**/*.ts" ], "Excludes": [ "**/*.d.ts" ] }
],
"CodeCoverageIncludes": [ "*app.js*" ],
"TestFileTimeout": 100000
}
最佳答案
TypeScript 生成合理数量的立即调用函数表达式。事实上,它们在文件加载后立即运行,这意味着无论如何它们都会被覆盖。如果您没有收到错误,则表明 22% 的代码可以工作 - 无需为此编写任何测试。
在 C# 或 Java 中,这种情况不会发生,因为如果您没有实例化一个类,它的覆盖率将为 0 - 但在 TypeScript 中,为模块和类生成的一些代码将在您加载文件时运行。
以下是本类(class)可能涵盖的线路的指示:
class Example {
doSomeWork() {
return 50;
}
}
覆盖范围:
✓ var Example = (function () {
✓ function Example() {
✓ }
✓ Example.prototype.doSomeWork = function () {
✗ return 50;
✓ };
✓ return Example;
✓ })();
正如您所看到的,有很多东西只需加载文件就可以“运行”。未涵盖实际行为(返回值的函数)。
我会以与普通对象上的属性类似的方式对这些代码行进行分类 - 您不会想编写特定的测试来覆盖它们 - 但它们会自然地被覆盖。
您无法真正为此调整您的报告,但足以说明您应该对 78% 而不是 22% 感兴趣。
关于javascript - 使用组合 JavaScript 文件 + Chutzpah/Blanket.js 获取准确的代码覆盖率统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709963/