JavaScript—;单元测试子任务

JavaScript—;单元测试子任务,javascript,unit-testing,abstraction,black-box,Javascript,Unit Testing,Abstraction,Black Box,他们说: 您应该测试接口,而不是实现 换句话说,您应该关注最终结果,而不是它是如何完成的(黑盒测试) 还有人说,您不应该测试私有函数,而应该只测试公开的公共接口。但我的问题是 对于依赖于几个私有子任务的公开接口(例如函数),您会怎么做?你应该如何进行测试 考虑下面的函数calculateDiscountedPrice让我们假设第一个函数是公共可用的(想想导出默认值),另外三个是私有的。 // PUBLIC TOP-LEVEL FUNCTION export default function ca

他们说:

您应该测试接口,而不是实现

换句话说,您应该关注最终结果,而不是它是如何完成的(黑盒测试)

还有人说,您不应该测试私有函数,而应该只测试公开的公共接口。但我的问题是

对于依赖于几个私有子任务的公开接口(例如函数),您会怎么做?你应该如何进行测试

考虑下面的函数
calculateDiscountedPrice
让我们假设第一个函数是公共可用的(想想导出默认值),另外三个是私有的。

// 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
是我们公开的公共函数,因此我们应该对其进行单元测试。但是其他三个子任务呢?我们为什么不测试一下呢?涵盖
CalculatedScontedPrice
的测试是否也涵盖了其他三项?

您不应该单独测试私有函数,这是正确的

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

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

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

  • price
    传递到一个整数,如
    10
    ,以通过调用
    isInt
    的“负”结果(准确地说,数字结果为0)
  • price
    传递到一个非整数,如
    7.35
    ,以通过调用
    isInt
  • 通过零折扣
    折扣
  • 通过非零折扣
    折扣
  • 使用先前变体的组合等
让我注意到,如果您从一开始就使用
TDD
技术,那么您基本上得到了这些测试用例


我还建议你花几分钟读一下Bob叔叔的这篇文章,Bob叔叔是著名的软件工程专家。

你说得对,你不应该单独测试私有函数

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

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

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

  • price
    传递到一个整数,如
    10
    ,以通过调用
    isInt
    的“负”结果(准确地说,数字结果为0)
  • price
    传递到一个非整数,如
    7.35
    ,以通过调用
    isInt
  • 通过零折扣
    折扣
  • 通过非零折扣
    折扣
  • 使用先前变体的组合等
让我注意到,如果您从一开始就使用
TDD
技术,那么您基本上得到了这些测试用例

我还建议你花几分钟时间读一下Bob叔叔的这篇文章,他是著名的软件工程专业人士。

可能的dup:可能的dup的可能副本:可能的dup的可能副本