我有一个TypeScript项目,它使用Visual Studio的“将JavaScript输出合并到文件中”选项来创建一个包含我所有应用程序代码(不包括库)的.js
文件。我正在使用Chutzpah Test Adapter来集成和运行Jasmine单元测试。如果我使用 no 测试运行代码覆盖率分析,该工具报告我有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
}
答案 0 :(得分:2)
TypeScript生成合理数量的立即调用的函数表达式。一旦文件被加载就会运行这一事实意味着它们无论如何都会被覆盖。如果您没有收到错误,那么22%的代码都可以运行 - 无需为此编写任何测试。
在C#或Java中,这不会发生,因为如果你没有实例化它,那么一个类将有0覆盖 - 但在TypeScript中,模块和类生成的一些代码将在你加载时运行文件。
以下是此课程可能包含的行的说明:
class Example {
doSomeWork() {
return 50;
}
}
覆盖范围:
✓ var Example = (function () {
✓ function Example() {
✓ }
✓ Example.prototype.doSomeWork = function () {
✗ return 50;
✓ };
✓ return Example;
✓ })();
正如你所看到的,有很多东西可以"运行"只需加载文件即可。 实际行为(返回值的函数)未被涵盖。
我会以与普通对象上的属性类似的方式对这些代码行进行分类 - 您不会想要编写特定的测试来覆盖它们 - 但它们会被自然覆盖。
你无法真正调整你的报告,但足以说你应该对78%而不是22%感兴趣。