你如何测试只在闭包范围内可见的javascript方法?

时间:2012-08-23 04:07:39

标签: javascript unit-testing closures jasmine

说我有以下javascript:

function Foo() {

    function privateStuff() {
       //do private stuff
    }

    this.publicStuff = function() {
        privateStuff();
        //do other stuff
    }

}

通过执行以下操作来测试publicStuff()非常简单:

var myFoo = new Foo();
myFoo.publicStuff();
//all the assertions

但是,我希望能够将privateStuff()方法作为自己的单元进行测试。我不确定我怎么可以自己调用它。我知道用Java(我更熟悉它)你可以使用反射来测试私有方法,但我想知道是否有任何方法可以自己测试这些函数。如果没有通用的方法,我已经开始使用Jasmine来运行我的单元测试。这个框架是否为此提供了任何功能?

2 个答案:

答案 0 :(得分:2)

你有代码的方式,你不能。您不允许任何内容对privateStuff具有范围访问权限。在我看来,你需要阅读闭包的概念(这是JavaScript的基础)。

每当你在JS中使用f() { ... }构造(以及其他几个,如try-catch块)时,你总是隐式地创建一个闭包。像你一样嵌套函数是完全合法的,但除非你给外部函数一个对内部函数的外部引用,否则只能从外部函数中访问内部函数。

来自Mozilla

  

您可以在函数中嵌套函数。嵌套(内部)函数对其包含(外部)函数是私有的。它也形成了一个封闭。

     

闭包是一个可以有空的表达式(通常是一个函数)   变量以及绑定这些变量的环境   (“关闭”表达式)。

     

由于嵌套函数是闭包,这意味着嵌套   函数可以“继承”其包含的参数和变量   功能。换句话说,内部函数包含的范围   外部功能。

     
      
  • 只能从外部函数中的语句访问内部函数。
  •   
  • 内部函数形成一个闭包:内部函数可以使用参数和
  •   

即使Mozilla文档延续了这一点,但在Javascript中说东西是privatepublic稍微不正确,因为命名法在大多数编程语言中具有非常明确的含义(如C ++和Java)这与多态行为或继承有关。就JS而言,最好将其视为范围有限并尝试深入了解闭包。

答案 1 :(得分:1)

你不能从外面做,这就是为什么它是“私人的”。你可以暂时暴露它:

this.privateStuff = privateStuff;

或者从范围内进行测试,如果可以,那么你正在测试它......