首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试javascript中的私有函数

测试javascript中的私有函数
EN

Stack Overflow用户
提问于 2009-04-04 00:53:47
回答 4查看 7.2K关注 0票数 17

我使用Javascript中的模块模式来分离我的公共接口和私有实现。为了简化我正在做的事情,我的代码生成了一个图表。图表由多个部分(轴、标签、图、图例等)组成。我的代码看起来像这样:

代码语言: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行代码的代码创建一个类似乎很愚蠢,而且它会更难看,因为我需要传入一堆私有状态。我就不能测试我的助手函数了。不管怎样,我应该这样做吗?我是不是应该接受它,只测试公共的draw()?还是有其他的解决方案?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-05 19:42:20

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

实际上,Javascript是一种面向对象的语言。它只是不是一个统计类型的。

票数 9
EN

Stack Overflow用户

发布于 2013-01-29 16:44:04

我的解决方案就是一点小技巧。QUnit示例:

在Qunit test html的顶部,我声明:

代码语言:javascript
复制
var TEST_AVAILABLE = true;

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

代码语言:javascript
复制
if(TEST_AVAILABLE){
   this.test={
      hasDraft:hasDraft,
      isInterpIdIn:isInterpIdIn,
      // other private methods
   };
}

在QUnit中,您可以验证

代码语言:javascript
复制
test( "hello booth", function() {
  var b = new Booth();
  ok(b);
  ok(b.test);
  ok(!b.test.hasDraft());
});
票数 5
EN

Stack Overflow用户

发布于 2012-10-08 10:46:23

我也有类似的问题。我想出的解决方案不是我喜欢的,但它确实有效,而且我找不到更好的解决方案。

代码语言:javascript
复制
function Graph()
{
    this.Test = function _Test(expressionStr) { return eval(expressionStr); }

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

要测试:

代码语言:javascript
复制
var g = new Graph();
g.Test("helper_func()") == something;
g.Test("private_data") == something2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/716207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档