javascript - 使用组合 JavaScript 文件 + Chutzpah/Blanket.js 获取准确的代码覆盖率统计数据

标签 javascript visual-studio typescript chutzpah blanket.js

我有一个 TypeScript 项目,它使用 Visual Studio 的“将 JavaScript 输出合并到文件中”选项来创建一个包含我的所有应用程序代码(不包括库)的 .js 文件。我正在使用Chutzpah Test Adapter集成并运行 Jasmine 单元测试。如果我在没有测试的情况下运行代码覆盖率分析,该工具会报告我的测试覆盖率是 23%:

Code coverage statistics

是什么导致了这一夸大的统计数据?

我当前的理论是,当 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/

相关文章:

javascript - 将包含特定数据的鼠标悬停添加到 d3.js 树形图

asp.net-mvc - 运行代码首次迁移时在程序集中找不到上下文类型

visual-studio - 有什么方法可以在您关闭文档时自动折叠到定义?

c# - 对象池设计模式关闭所有空闲连接

javascript - 如何用 lodash 比较两个对象并返回新对象?

javascript - 我如何添加或附加多个下拉菜单

javascript - 如果 Typescript 只是输出到 Javascript,为什么要创建它作为一种单独的语言?

使用 express-ws 的 "app.ws" typescript 错误

Angular url 不区分大小写

javascript - 如何使用 puppeteer 生成可编辑的 PDF