当使用功能性方法时,纽约市的报道对我不起作用。拉姆达

Nyc coverage is not working for me when using functional approach with e.g. ramda

所以我的代码是这样的:

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。请注意,我使用 Ramda 中的 R.ifElse 可组合项。所有单元测试都通过了,这就是我不显示它们的原因,但覆盖率报告显示 0% Branches 0/1。使用命令式 if 分支,我在覆盖率报告中有 2/3。

有没有人在编写代码时也有过不使用 if-else 分支(或循环)的经历?似乎 nyc 只是在寻找 if-else,for/while 分支,否则我可能错了。

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

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

给定 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. "imperative" 版本报告 50% 的分支覆盖率

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

如果 100% 的代码覆盖率是您的目标,那么代码审查中可能没有人会指出您缺少测试用例。如果您已经成功覆盖了整个代码,他们为什么要这么做?


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

我不确定这个问题是否只有一个答案,但我绝对建议您查看 property-based 测试。它肯定可以帮助您编写更彻底的测试。

如果您有兴趣,我发现这个 article 非常有用。