In vielen Frameworks werden interne Funktionsvariablen als private Variablen verwendet, zum BeispielZugang innere Funktionsvariablen in Javascript
Raphael = (function(){
var _private = function(a,b) {return a+b;};
var _public = function(a) {return _private(a,a);}
var object = {mult2:_public};
return object;
})();
hier, wir nicht private
aus dem globalen Namensraum der Variablen mit dem Namen zugreifen können, als es ein inneres ist Variable der anonymen Funktion in der ersten Zeile.
Manchmal enthält diese Funktion ein großes Javascript-Framework, so dass es den globalen Namespace nicht verschmutzen würde.
Ich brauche Unit-Tests einige Objekt Raphael
verwendet intern (im obigen Beispiel möchte ich Unit-Tests auf das Objekt private
ausführen). Wie kann ich sie testen?
bearbeiten: Ich erhielt Kommentare über Unit-Tests, die öffentliche Schnittstellen testen sollen.
Lassen Sie mich einen Anwendungsfall angeben. Ich schreibe eine Bibliothek namens Raphael
. Diese Bibliothek soll dem globalen Namespace nur einen einzigen Namen hinzufügen, und nichts mehr. Dies ist eine besondere Voraussetzung für Javascript, da Javascript keine Namespaces hat.
Nehmen wir an, Raphael
verwendet eine verkettete Liste. Wenn Sie Javascript um die Vorstellung der Pakete hätte, würde ich tun
require 'linked_list'
Raphael = (function(){/* use linked list */})();
aber Javascript erlaubt mir nicht, dass in irgendeiner Weise zu tun, die nicht die globale Reichweite mit der verknüpften Liste Objekt verschmutzen würde!
Raphael = (function(){
/* implement linked list */
var linked_list = function(){/*implementation*/};
})();
Und nun möchte ich linked_list
Implementierung testen: Ich bin daher Inline linked_list
in Raffaels lokalen Bereich gebunden.
Die Idee hinter Unittests ist, öffentliche Funktionen/Methoden nur zu testen – Andrey
@Andrey, Javascript ist nicht Ihre Alltagssprache! Sie können andere Module nicht vernünftig importieren. Wenn ich also eine kleine, sagenumwobene, verknüpfte Listenimplementierung für Raphael verwenden möchte, muss sie in Raphaels interne Funktion eingebunden werden, damit sie nicht angezeigt wird der Benutzer von Raphael. Ich kann nicht einfach "#" es einschließen ... –
Siehe: http://stackoverflow.com/questions/2230469/javascript-sandbox-unit-testing http://stackoverflow.com/questions/716207/testing-private -functions-in-javascript http://stackoverflow.com/questions/1881078/testing-javascript-functions-inside-anonymous-functions et all – gnarf