else 单元测试中未采用的路径

Posted

技术标签:

【中文标题】else 单元测试中未采用的路径【英文标题】:else path not taken in unit testing 【发布时间】:2020-03-11 14:50:04 【问题描述】:

我正在研究 Angular 6

我的以下代码中没有任何 else 语句。但由于未采用 else 路径,我无法覆盖分支。在这种情况下,我需要做什么才能获得 100% 的分支覆盖率?

 getHeaderDocumentList(documents: any) 
            if (documents) 
                documents.result.docAttachment.forEach(element => 
                    this.headerdocumentdetails.push(element.DocumentUniqueID);
                );
            
        

【问题讨论】:

您是否尝试将评估为 false 的输入传递给 if 语句并绕过它? 【参考方案1】:

为了报告完整的覆盖率,代码需要最终到达(此处不明确存在的)else-path。就此而言,传入falsy 参数,如0 | false | undefined | null | NaN | '' | "" | ``,如

component.getHeaderDocumentList(false);
expect(false).toEqual(false); // This line is optional. Most test suites require some kind of assertion in each test.

现在您的测试套件应该报告两个分支都已覆盖。

最后的解决方案是在 if 案例之前添加/* istanbul ignore else */。这将告诉记者有效地忽略 else 路径

【讨论】:

好主意!但在某些情况下,我无法解决此问题。任何方式到现在 80% 就足够了。还有一个问题:你听说过sourceMap:true 嗯,这很奇怪。一旦你再次运行测试,它应该停止抱怨。 最后的解决方案是在 if 案例之前添加/* istanbul ignore else */。这将告诉记者有效地忽略 else 路径。 如果一个假/空文档列表的预期输出是headerdocumentdetails没有改变,那就是一个有效的测试。【参考方案2】:

只需在没有else 部分的if 语句之前添加/* istanbul ignore else */。 Coverage Reporter 将忽略 else 路径。

【讨论】:

以上是关于else 单元测试中未采用的路径的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4 单元测试中未调用 ngOnChanges detectChanges()

Angular 单元测试中未定义的 ag-grid API

为 if else 语句编写单元测试

如何在单元测试期间访问 .war 类路径中的文件?

SpringBoot整合Mybatis进行单元测试mapper和xml路径不一致出现的诡异问题

什么是 JavaScript 单元测试的代码覆盖分支