在javascript中测试私有函数

swa*_*ohn 17 javascript unit-testing

我在Javascript中使用模块模式将我的公共接口与私有实现分开.为了简化我正在做的事情,我的代码生成了一个图表.该图表由多个部分(轴,标签,图,图例等)组成.我的代码如下所示:

var Graph = function() {
  var private_data;
  function draw_legend() { ... }
  function draw_plot() { ... }
  function helper_func() { ... }
  ...

  return {
    add_data: function(data) {
      private_data = data;
    },
    draw: function() {
      draw_legend()
      draw_plot()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有些人主张只测试你的类的公共接口,这是有道理的,但我真的想进行一些测试来分别测试每个组件.如果我搞砸了我的draw_legend()函数,我希望测试失败,而不是公共draw()函数的测试.我在这里走错了路吗?

我可以将不同类中的每个组件分开,例如创建一个Legend类.但是,为有时只有5到10行代码创建一个类似乎很愚蠢,而且它会更加丑陋,因为我需要传递一堆私有状态.而且我无法测试我的助手功能.我还应该这样做吗?我应该吸吮它,只测试公共抽奖()吗?还是有其他解决方案吗?

Hel*_*lgi 9

无法从外部作用域访问内部函数(私有).如果要测试内部函数,可以考虑添加公共方法以仅用于测试目的.如果您正在使用某种构建环境,例如ant,您可以预处理javascript文件以进行生产并删除这些测试函数.

实际上Javascript是面向对象的语言.它不是一个类型化的类型.

  • @pcjuzer,Javascript绝对是面向对象的,它的实现方式与大多数人都熟悉的经典OO语言不同. (12认同)
  • 实际上,Javascript不是面向对象的,它是基于原型的.它只是可以模仿OO行为. (6认同)

tak*_*sot 5

我的解决方案只是一点点破解.QUnit示例:

在Qunit测试html的顶部我声明:

var TEST_AVAILABLE = true;
Run Code Online (Sandbox Code Playgroud)

在testable类中,我有一个像这样的片段:

if(TEST_AVAILABLE){
   this.test={
      hasDraft:hasDraft,
      isInterpIdIn:isInterpIdIn,
      // other private methods
   };
}
Run Code Online (Sandbox Code Playgroud)

在QUnit中你可以验证

test( "hello booth", function() {
  var b = new Booth();
  ok(b);
  ok(b.test);
  ok(!b.test.hasDraft());
});
Run Code Online (Sandbox Code Playgroud)