【发布时间】:2018-10-16 15:07:41
【问题描述】:
他们说:
“你应该测试接口,而不是实现。”
换句话说,您应该关注最终结果,而不是如何完成(黑盒测试)。
也有人说您应该不测试私有函数,而只测试公开的公共接口。但我的问题是……
对于依赖于多个私有子任务的公开接口(例如函数),您会怎么做?你应该如何进行测试?
考虑下面的函数calculateDiscountedPrice。 让我们假设第一个函数是公开可用的(认为导出默认),而其他 3 个是私有的。
// PUBLIC TOP-LEVEL FUNCTION
export default function calculateDiscountedPrice(price, discount) {
const dollarsOff = getDollarsOff(price, discount);
return round(price - dollarsOff);
}
// PRIVATE SUBTASK
function getDollarsOff(price, discount) {
return price * discount;
}
// PRIVATE SUBTASK
function round(number, precision = 2) {
return isInt(number)
? number
: number.toFixed(precision);
}
// PRIVATE SUBTASK
function isInt(number) {
return number % 1 === 0;
}
示例用法:
console.log(calculateDiscountedPrice(100, 0.75)) // 25
如您所见,calculateDiscountedPrice 是我们公开的公共函数,因此我们应该对其进行单元测试。但是其他三个子任务呢?为什么我们不应该测试这些?涵盖calculateDiscountedPrice 的测试是否也涵盖其他三个?
【问题讨论】:
标签: javascript unit-testing abstraction black-box