【问题标题】:JavaScript — Unit Testing SubtasksJavaScript — 单元测试子任务
【发布时间】: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


【解决方案1】:

你是对的,你不应该单独测试私有函数。

当您为公开可用的代码编写测试时,您应该尽可能多地考虑代码中的分支 - 这样您的测试也将触及所有私有函数。

更严格地说,您不需要为所有公开可用的函数编写测试,否则您也要测试实现。

因此,对于这个特定的示例,您可以编写如下测试:

  • price 传递给像10 这样的整数,以通过调用isInt 的“否定”结果(准确地说,数字结果为0)
  • price 传递给像7.35 这样的非整数,以通过调用isInt 的“积极”结果
  • 通过零discount
  • 通过非零discount
  • 使用以前变体的组合等。

让我注意到,如果您从一开始就使用TDD 技术,那么您将获得这些测试用例。

我还建议您花几分钟时间阅读这篇 article 的鲍勃叔叔,他是著名的软件工程专业人士。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2011-06-23
    • 2016-02-11
    相关资源
    最近更新 更多