如何测试只在闭包范围中可见的javascript方法
How do you test javascript methods only visible in the closure scope?
假设我有以下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中说这些东西是private
或public
有点不正确,因为在大多数与多态行为或继承有关的编程语言(如C++和Java)中,这种命名法具有非常明确的含义。就JS而言,最好将其视为范围有限的,并尝试获得对闭包的深刻理解。
你不能在外面做,这就是为什么它是"私有的"。你可以暂时曝光:
this.privateStuff = privateStuff;
或者从范围内进行测试,如果可能的话,无论你测试的是什么…
- 如何创建一个方法来验证数组的范围
- JavaScript对象范围-在对象方法中使用对象变量
- 如何测试只在闭包范围中可见的javascript方法
- 在 JavaScript 中获取范围的随机数的最佳方法
- Vue.js 在方法内失去范围
- 是否可以对超出范围的 setInterval 变量调用 clearInterval 方法
- 如何在 javascript 中更改方法调用的全局范围
- 在日期范围内查找丢失日期的最有效方法是什么
- 是否有任何方法可以访问外部范围's变量
- 当生成正态分布的随机值时,定义范围的最有效方法是什么
- javascript ES6类/方法范围
- AngularJs,DropZone.Js - 有没有人想出一种方法来将Dropzone传输保留在Angular根范围内
- Javascript 对象方法范围 - 方法失败
- 谷歌地图变量的范围和调用方法
- jQuery插件样板 - 具有绑定范围的私有方法
- 如何从 ui-grid 中显示的按钮调用范围方法 - 在 Angular js 中
- ExpressJS中POST方法上的变量会话的范围
- 如何使用 ExtJS 4 中控制器的控制方法更改范围
- 如何从 ngGrid 中显示的按钮调用范围方法
- 用sinon存根在角控制器构造中调用的范围方法