Я не думаю, что покрытие кода не работает, оно просто становится менее полезным в условиях функционального программирования.
Вот что я поделился в презентации на работе:
Дано 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');
Тогда вы получите следующий охват кода:
Как видно из того же теста:
- Версия функционального программирования сообщает о 100% покрытии ветки
- «Императивная» версия сообщает о 50% охвате филиала
Лично я считаю, что это хорошо, так как я всегда говорю это своим товарищам по команде: охват кода - это инструмент, а не правило. Это должно помочь вам разработать меньше, но лучших тестов. Это никогда не должно быть целью.
Если ваша цель - 100% покрытие кода, то есть вероятность, что никто в проверке кода не отметит, что вы пропустили тестовый пример. Почему они должны, если вы успешно охватили весь код?
Так как же вы пишете лучшие тесты?
Я не уверен, что есть один ответ на этот вопрос, но я бы определенно рекомендовал вам изучить тестирование на основе свойств. Это может помочь вам написать более тщательные тесты.
Если вам интересно, я нашел эту статью чрезвычайно полезной.