当使用功能性方法时,纽约市的报道对我不起作用。拉姆达
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');
那么你得到的代码覆盖率如下:
正如您在同一测试中所见:
- 函数式编程版本报告 100% 分支覆盖率
- "imperative" 版本报告 50% 的分支覆盖率
我个人认为这是一件好事,因为我总是对我的队友说:代码覆盖率是一种工具,而不是规则。它应该可以帮助您设计更少但更好的测试。它永远不应该是一个目标。
如果 100% 的代码覆盖率是您的目标,那么代码审查中可能没有人会指出您缺少测试用例。如果您已经成功覆盖了整个代码,他们为什么要这么做?
那么如何编写更好的测试?
我不确定这个问题是否只有一个答案,但我绝对建议您查看 property-based 测试。它肯定可以帮助您编写更彻底的测试。
如果您有兴趣,我发现这个 article 非常有用。
所以我的代码是这样的:
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');
那么你得到的代码覆盖率如下:
正如您在同一测试中所见:
- 函数式编程版本报告 100% 分支覆盖率
- "imperative" 版本报告 50% 的分支覆盖率
我个人认为这是一件好事,因为我总是对我的队友说:代码覆盖率是一种工具,而不是规则。它应该可以帮助您设计更少但更好的测试。它永远不应该是一个目标。
如果 100% 的代码覆盖率是您的目标,那么代码审查中可能没有人会指出您缺少测试用例。如果您已经成功覆盖了整个代码,他们为什么要这么做?
那么如何编写更好的测试?
我不确定这个问题是否只有一个答案,但我绝对建议您查看 property-based 测试。它肯定可以帮助您编写更彻底的测试。
如果您有兴趣,我发现这个 article 非常有用。