Чего именно не хватает в моих тестах для Стамбула, чтобы пожаловаться на отсутствие покрытия ветвей?

#angular #typescript #istanbul

#angular #typescript #istanbul

Вопрос:

Хоть убейте, я не могу понять, на что жалуется Стамбул здесь. У меня есть одна ветвь, которая не обнаружена в этом файле. Вот соответствующая часть рассматриваемого компонента (я удалил несвязанные биты, чтобы избежать шума):

 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, typescript 3.1.6

Комментарии:

1. Какую версию Angular вы используете? Я смутно помню, что в более ранней версии была ошибка с покрытием.

2. @MMansour Я добавлю это в вопрос — Angular 7.1.0

3. Когда я запускал этот класс и этот тест, я не получал подсветку в том же месте, что и вы. Вместо этого это было в этой строке return this._field.name in this._record ? this._record[this._field.name] : ''; в остальной части троичного. Не уверен, что это помогает.

4. @MMansour странно… возможно, это просто проблема со Стамбулом. Я немного новичок в покрытии кода, поэтому я просто предположил, что это то, что я делаю неправильно. У меня есть отдельные тесты для покрытия этой конкретной ветки, я просто не включил их, чтобы упростить пример.

Ответ №1:

Похоже, что это открытая проблема для Стамбула. Похоже, что использование другого класса таким образом может вызвать некоторые проблемы. Одним из возможных исправлений в этом потоке является указание возвращаемого типа, подобного any для метода. Вероятно, проблема в javascript, на который переводится TS. В javascript, вероятно, есть ветка, которой нет в вашем коде.

Комментарии:

1. Да, похоже, что это действительно может быть так … немного неприятно, но у меня нет требований к покрытию кода, установленных на 100%, поэтому я просто проигнорирую пока…