Покрытие Nyc не работает для меня при использовании функционального подхода, например, ramda - PullRequest
0 голосов
/ 01 июля 2019

Итак, мой код такой:

const handler = (event = { body: {} }) => {
  if (isEventEmpty(event)) {
    return Promise.resolve({})
  }
  const getPayload = R.compose(
    R.flatten,
    R.map(x => transformRecord(x)),
    R.pluck('Stuff'),
    R.path(['body'])
  )
  const processEvent = R.compose(
    toPromise,
    R.ifElse(isEventEmpty, R.always({}), getPayload)
  )
  return processEvent(event)
}

module.exports = { handler }

При if (isEventEmpty(event)) { покрытие составляет 66,67%, что нормально.Но без этого if охват будет равен 0. Обратите внимание, что я использую R.ifElse, составляемый из Рамды.Все юнит-тесты проходят, поэтому я их не показываю, но в отчете о покрытии показывается 0% Branches 0/1.С обязательным ответвлением if у меня есть 2/3 в отчете о покрытии.

Есть ли у кого-нибудь опыт НЕ использовать ветвление (или циклы) if-else при написании своего кода?Похоже, что nyc ищет только if-else, ветки / while или я могу ошибаться.

1 Ответ

4 голосов
/ 01 июля 2019

Я не думаю, что покрытие кода не работает, оно просто становится менее полезным в условиях функционального программирования.

Вот что я поделился в презентации на работе:

Дано yes-no.js:

module.exports = bool => bool === true ? 'yes' : 'no';

А yes-no-fp.js

const {ifElse, equals, always} = require('ramda');

module.exports = ifElse(equals(true),always('yes'),always('no'));

И следующие тесты:

test.true(yesOrNo(true) === 'yes');
test.true(yesOrNoFp(true) === 'yes');

Тогда вы получите следующий охват кода:

enter image description here

Как видно из того же теста:

  1. Версия функционального программирования сообщает о 100% покрытии ветки
  2. «Императивная» версия сообщает о 50% охвате филиала

Лично я считаю, что это хорошо, так как я всегда говорю это своим товарищам по команде: охват кода - это инструмент, а не правило. Это должно помочь вам разработать меньше, но лучших тестов. Это никогда не должно быть целью.

Если ваша цель - 100% покрытие кода, то есть вероятность, что никто в проверке кода не отметит, что вы пропустили тестовый пример. Почему они должны, если вы успешно охватили весь код?


Так как же вы пишете лучшие тесты?

Я не уверен, что есть один ответ на этот вопрос, но я бы определенно рекомендовал вам изучить тестирование на основе свойств. Это может помочь вам написать более тщательные тесты.

Если вам интересно, я нашел эту статью чрезвычайно полезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...