Как увеличить охват филиала в шутке в цикле for-in с условием if? - PullRequest
0 голосов
/ 27 июня 2019

У меня следующий код, который отображает несколько полей из объекта в другой и копирует значение:

//Function params
var source= {"f1": "v1", "f2": "v2", "f3":"v3"};
var fieldsMapping = {"f1": "c1", "f2":"c2"};

//function definition starts
var copiedObj = {};    
for (var name in source) {
  if (source.hasOwnProperty(name)) { //Line X
    if(fieldsMapping[name]){
        copiedObj[fieldsMapping[name]] = source[name];
    }
  }
}

console.log(copiedObj); //outputs {c1: "v1", c2: "v2"}

Я написал тестовый пример для этой функции в jest, со 100% заполнением строкино покрытие филиала отображает Line X не распространяется.Согласно Стандартам , аналогичным в TSLint , за for-in следует цикл if condition.

Кто-нибудь может подсказать, как увеличить тестовый набор branch coverage для этого?

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Дополнительная if предназначена для надежности вашего кода. Такие проверки надежности не поддаются проверке разумным способом. Это также будет происходить в различных других частях вашего кода - это часто происходит в операторах switch, где все возможные случаи явно рассматриваются, и добавляется дополнительный случай по умолчанию, просто чтобы вызвать исключение или иным образом обработать эту «невозможную» ситуацию. Или подумайте об утверждениях утверждений, добавленных в код: поскольку утверждения никогда не должны заканчиваться ошибкой, строго говоря, вы никогда не сможете охватить ветвь else, которая скрыта внутри утверждения утверждений - как вы проверяете, что выражение внутри утверждения хорошо для на самом деле обнаружить проблему, которую вы хотите?

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

И, наконец, помните, что высокий охват кода не обязательно свидетельствует о высоком качестве вашего тестового набора. Ваш набор тестов имеет высокое качество, если он обнаружит ошибки в коде, которые могут существовать. У вас может быть набор тестов со 100% охватом, который не обнаружит потенциальных ошибок.

1 голос
/ 27 июня 2019

Итак, вы видите, что это означает, что if выполняется для всех ваших тестовых случаев.Вот почему покрытие линии показывает 100%.Но чтобы получить 100% -ное покрытие ветви, нужно, чтобы if не выполнялось для какого-то конкретного теста.

hasOwnProperty возвращает false для свойств, унаследованных от прототипа.Поэтому мы будем использовать это, чтобы эта строка не выполнялась:

const base = { a: 1};
const source = Object.create(base, {b: 2, c: 3} );
const fieldsMapping = {a: 'aa', b: 'bb', c: 'cc'};

expect(yourFunction(source, fieldsMapping)).toEqual({ bb: 2, cc: 3 }); 

PS старайтесь не зависеть от цели 100% -coverage-goal.

...