在Node中的另一个方法内声明的单元测试方法

问题描述 投票:0回答:1

我有一个以下格式的节点模块

'use strict’;

/// require dependencies here 

function outerFunc1(a, b, c) {

  function f1() {
    return f2()
  }

  function f2() {
    return 2
  }
  f1();
}
const choose = (type) => {
  let funcToCall
  switch (type) {
    case "func1":
      funcToCall = outerFunc1;
      break;
  }
  return funcToCall;
}

module.exports = (function () {
  return {
    choose
  };
})();

任何人都可以告诉我如何单元测试函数f2和f1,或者换句话说我如何调用它,是否有任何方法可以实现相同,如使用反射api或任何其他方式使用重新连接或sinon?

javascript node.js unit-testing reflection sinon
1个回答
0
投票

f1f2的所有功能都可以通过公共API函数间接激发。因此,没有充分的理由自己测试它们。相反,有理由再次对它们进行自我测试:每当outerFunc1的实施发生变化时,f1f2以打破测试的方式受到影响的可能性似乎很高。

但请注意,我并不反对测试实现细节:您应该设计测试,以便找到所有潜在的错误 - 这意味着您应该考虑实现细节。单元测试是正确的方法,因为它的目的正是使用白盒知识测试代码中最小的可测试实体。例如,当您使用分支覆盖率分析来查看是否错过了某些测试时,您正在利用有关代码控制结构的白盒知识。

有些人认为你不应该测试实现,而只测试行为。原因是否则测试套件会变得脆弱。虽然避免测试套件变得不必要地脆弱无疑是一个有效的目标,但它并不是最优先考虑的问题。最高优先级是IMO,可以找到生产代码中的所有错误。这也需要测试实现细节。

如果某些计算使用缓存来更快地重新生成已经计算的结果,那么从用户的角度来看,这将是一个实现细节。但是,当然,缓存算法可能包含错误,因此应该测试缓存。更一般地说,更大系统的每个子系统(小或大)都可以看作是更大系统的实现细节。但这并不意味着测试只应在最外层的系统边界上进行。

© www.soinside.com 2019 - 2024. All rights reserved.