说我有以下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来运行我的单元测试。这个框架是否为此提供了任何功能?
答案 0 :(得分:2)
你有代码的方式,你不能。您不允许任何内容对privateStuff
具有范围访问权限。在我看来,你需要阅读闭包的概念(这是JavaScript的基础)。
每当你在JS中使用f() { ... }
构造(以及其他几个,如try-catch
块)时,你总是隐式地创建一个闭包。像你一样嵌套函数是完全合法的,但除非你给外部函数一个对内部函数的外部引用,否则只能从外部函数中访问内部函数。
来自Mozilla:
您可以在函数中嵌套函数。嵌套(内部)函数对其包含(外部)函数是私有的。它也形成了一个封闭。
闭包是一个可以有空的表达式(通常是一个函数) 变量以及绑定这些变量的环境 (“关闭”表达式)。
由于嵌套函数是闭包,这意味着嵌套 函数可以“继承”其包含的参数和变量 功能。换句话说,内部函数包含的范围 外部功能。
- 只能从外部函数中的语句访问内部函数。
- 内部函数形成一个闭包:内部函数可以使用参数和
即使Mozilla文档延续了这一点,但在Javascript中说东西是private
或public
稍微不正确,因为命名法在大多数编程语言中具有非常明确的含义(如C ++和Java)这与多态行为或继承有关。就JS而言,最好将其视为范围有限并尝试深入了解闭包。
答案 1 :(得分:1)
你不能从外面做,这就是为什么它是“私人的”。你可以暂时暴露它:
this.privateStuff = privateStuff;
或者从范围内进行测试,如果可以,那么你正在测试它......