当前位置:  开发笔记 > 编程语言 > 正文

在javascript中测试私有函数

如何解决《在javascript中测试私有函数》经验,为你挑选了2个好方法。

我在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()
    }
  }
}

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

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



1> Helgi..:

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

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


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

2> takacsot..:

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

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

var TEST_AVAILABLE = true;

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

if(TEST_AVAILABLE){
   this.test={
      hasDraft:hasDraft,
      isInterpIdIn:isInterpIdIn,
      // other private methods
   };
}

在QUnit中你可以验证

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有