【问题标题】:What exactly is missing in my tests for istanbul to complain about missing branch coverage?我的测试中究竟缺少什么让伊斯坦布尔抱怨缺少分支覆盖?
【发布时间】:2019-09-13 19:26:08
【问题描述】:

对于我的生活,我无法弄清楚伊斯坦布尔在这里抱怨什么。我在这个文件中发现了一个分支。这是相关组件的相关部分(我删除了不相关的位以避免噪音):

export class TextComponent {
    value: string;
    _field: FieldModel;
    private _record: any;

    @Input()
    set field(field: FieldModel) {
        this._field = field;
        this.cacheValue();
    }

    @Input()
    set record(record: any) {
        this._record = record;
        this.cacheValue();
    }

    cacheValue() {
        this.value = this.getValue();
    }

    getValue(): string {
        if (!this._record || !this._field) {
            return '';
        }

        return this._field.name in this._record ? this._record[this._field.name] : '';
    }
}

还有一个样本测试:

    it('should store the record value', () => {
        component.record = {
            first: "Nancy",
            last: "Sue",
        };
        expect(component.value).toBe('');

        component.field = {name: 'first'};
        expect(component.value).toBe('Nancy');
    });

我的代码覆盖率是 100%,但缺少一个分支。这是代码覆盖率报告显示的内容:

我确定黄色的小亮点是伊斯坦布尔认为没有被覆盖的分支。但是,我不知道它实际上在抱怨什么,因此我不知道如何编写测试来覆盖它。我包含的示例测试是我对此功能的主要测试。显然它在某些方面存在缺陷,但我不明白在什么方面,而且那个小亮点也不是很丰富。

Angular 7.1.0,打字稿 3.1.6

【问题讨论】:

  • 您运行的是哪个版本的 Angular?我隐约记得早期版本中存在覆盖错误。
  • @MMansour 我会把它放在问题中 - Angular 7.1.0
  • 当我跑那门课和那次测试时,我没有和你在同一个地方得到突出显示。相反,它位于三元组其他部分的return this._field.name in this._record ? this._record[this._field.name] : ''; 这一行上。不确定这是否有帮助。
  • @MMansour 奇怪......也许这只是伊斯坦布尔的问题。我对代码覆盖率有点陌生,所以我只是认为这是我做错了。我有单独的测试来覆盖那个特定的分支,我只是为了保持示例简单而没有包括它们。

标签: angular typescript istanbul


【解决方案1】:

看起来这是open issue for istanbul。似乎以这种方式使用另一个类会导致一些问题。此线程中的一个潜在修复是为该方法指定一个返回类型,如any。问题可能出在 TS 被翻译成的 javascript 中。 javascript 可能有一个您的代码没有的分支。

【讨论】:

  • 是的,看起来情况确实如此……有点讨厌,但我没有将代码覆盖率要求设置为 100%,所以我暂时忽略。 ..
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2015-07-29
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多