Access To Private Methods For Testing Purposes// '__TPM' could be also conditionally defined with say:
// if (/staging|development/g.test(document.domain) )
// or a querystring '&debug=1' param etc.
if (typeof Function.prototype.__TPM === "undefined") {
Function.prototype.__TPM = function(privScope, bindToScope, func, args) {
return privScope[func].apply(bindToScope, args);
};
}
var PublicModule =
(function() {
var publicAPI,
_t = this,
__TPM = Function.prototype.__TPM; //'TestPrivateMethods'
_t._privFunc = function(sIn) {
return _t.privFunc2('dlroW' + sIn);
};
_t.privFunc2 = function(sIn) {
if (!sIn) {
return;
}
return sIn.split("").reverse().join("");
};
// Now the public methods
publicAPI = {
publicFunc: function() {
return 'hello';
},
//second public method (NOTE this one relies on a private method)
publicFunc2: function(sIn) {
return _t._privFunc(sIn);
}
};
if (__TPM) {
publicAPI.__TPM = function(sFuncName) {
return __TPM(_t, publicAPI, sFuncName, Array.prototype.slice.call(arguments, 1));
};
}
return publicAPI;
}),
PublicModule = PublicModule.call(PublicModule);
equal(PublicModule.publicFunc(), "hello");
equal(PublicModule.publicFunc2(" ,Olleh"), "hellO, World");
equal(typeof PublicModule._privFunc, "undefined"); // Private method is inaccessble to outside world so expect undefined.
var mocked_privFunc = {
_privFunc: function(sIn) {
return PublicModule.__TPM("_privFunc", sIn).toUpperCase();
}
};
equal(Function.prototype.__TPM(mocked_privFunc, {}, "_privFunc", ["yensiD"]), "DISNEYWORLD");