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

How do you test javascript methods only visible in the closure scope?

本文关键字:范围 方法 javascript 闭包 何测试 测试      更新时间:2023-09-26

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

按照你的代码方式,你做不到。您不允许任何内容具有对privateStuff的作用域访问权限。在我看来,您需要了解闭包的概念(这是JavaScript的基础)。

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

来自Mozilla:

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

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

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

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

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

你不能在外面做,这就是为什么它是"私有的"。你可以暂时曝光:

this.privateStuff = privateStuff;

或者从范围内进行测试,如果可能的话,无论你测试的是什么…