4

假设我有以下 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来运行我的单元测试。这个框架是否为此提供了任何功能?

4

2 回答 2

2

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

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

来自Mozilla

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

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

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

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

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

于 2012-08-23T04:21:54.457 回答
1

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

this.privateStuff = privateStuff;

或者从范围内进行测试,如果可以的话,但是你正在测试它......

于 2012-08-23T04:14:58.127 回答