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

如何测试只在闭包范围内可见的javascript方法?,javascript,unit-testing,closures,jasmine,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(); myF

假设我有以下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(我更熟悉Java)可以使用反射来测试私有方法,但我想知道是否有任何方法可以单独测试这些函数。如果没有通用的方法,我已经开始使用来运行我的单元测试。此框架是否提供了任何功能?

您不能从外部执行此操作,这就是为什么它是“私有的”。您可以临时公开它:

this.privateStuff = privateStuff;

或者从范围内进行测试,如果可能的话,不管您是如何测试它的…

您的代码在那里的方式,您不能。您不允许任何内容具有对
privateStuff
的作用域访问。在我看来,您需要仔细阅读闭包的概念(这是JavaScript的基础)

无论何时在JS中使用
f(){…}
构造(以及其他一些构造,如
try catch
块),都会隐式创建闭包。像您这样嵌套函数是完全合法的,但是除非您为外部函数提供对内部函数的外部引用,否则只能从外部函数内部访问内部函数

发件人:

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

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

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

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

尽管Mozilla文档将其永久化,但在JavaScript中,“ToS>代码>私有< //>或<代码>公共< /代码>,这是有点不对的,因为术语在大多数编程语言(如C++和java)中具有非常明确的含义,这与多态行为或继承有关。就JS而言,最好将其视为范围有限的,并尝试对闭包有深入的了解。

也许您应该在Foo上进行黑盒测试,而不是白盒测试,因为白盒测试是您了解实现的。或者以一种使白盒测试成为可能的方式公开实现。我以前听过这个论点,但我想确保这些helper/util非公开函数正确地完成了它们的工作单元。好吧,我最初想知道是否有一些通用的方法来实现这一点,但听起来好像没有。我已经开始和Jasmine一起做一些javascript单元测试;函数是唯一创建作用域的东西。(关于
{…}
构造的部分)@minitech-try-catch块也引入了一个新的作用域,但在其他方面你是正确的。是的,它们确实引入了。这种行为已经被记录并观察了很多次:&(懒得去查找ECMA段落,但它也在那里!)。这只是捕获变量的一个新范围,不是实际的新范围,但是。。。好的:)
with(){…}
也会稍微修改词法范围,但这是一个有点特殊的情况。在根据之前的评论进行编辑之前,您似乎误解了
try-catch
块中范围的更改方式。下面是一个(可能有用的)示例:取自上述来源之一。