0

So my code is this:

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 }

With if (isEventEmpty(event)) { coverage is 66.67% which is fine. But without that if coverage will be 0. Notice that I use R.ifElse composable from Ramda. All unit tests pass that's why I'm not showing them, but coverage report shows 0% Branches 0/1. With imperative if branch I have 2/3 in coverage report.

Does anyone have also experience NOT using if-else branching (or loops) when writing their code? Seems that nyc is only looking in if-else, for/while branches or I might be wrong.

4

1 回答 1

4

我不认为代码覆盖不起作用,它只是在函数式编程设置中变得不那么有用。

这是我在工作演示中分享的内容:

给定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');

然后你得到以下代码覆盖率:

在此处输入图像描述

正如你在同一个测试中看到的:

  1. 函数式编程版本报告 100% 分支覆盖率
  2. “命令式”版本报告 50% 的分支覆盖率

我个人认为这是一件好事,因为我总是对我的队友说:代码覆盖率是一种工具而不是规则。它应该可以帮助您设计更少但更好的测试。它永远不应该是一个目标。

如果 100% 的代码覆盖率是您的目标,那么代码审查中的任何人都可能会标记您缺少测试用例。如果你已经成功地覆盖了整个代码,为什么还要他们呢?


那么如何编写更好的测试呢?

我不确定这个问题是否只有一个答案,但我绝对建议您研究基于属性的测试。它肯定可以帮助您编写更彻底的测试。

如果你有兴趣,我发现这篇文章非常有用。

于 2019-07-01T11:20:30.523 回答