Auf innere Funktionsvariablen in Javascript zugreifen

8

In vielen Frameworks werden interne Funktionsvariablen als private Variablen verwendet, zum Beispiel

%Vor%

Hier können wir nicht aus dem globalen Namespace auf die Variable private zugreifen, da es sich um eine innere Variable der anonymen Funktion in der ersten Zeile handelt.

Manchmal enthält diese Funktion ein großes JavaScript-Framework, so dass der globale Namespace nicht verschmutzt wird.

Ich muss einige Objekte in Raphael intern testen (im obigen Beispiel möchte ich Unit-Tests für das Objekt private ausführen). Wie kann ich sie testen?

edit: Ich habe Kommentare zu Komponententests erhalten, 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, dass Raphael eine verkettete Liste verwendet. Wenn Javascript die Vorstellung von Paketen hätte, würde ich

machen %Vor%

Aber Javascript erlaubt mir das nicht in irgendeiner Weise, die den globalen Geltungsbereich nicht mit dem verknüpften Listenobjekt verschmutzen würde! Ich bin daher verpflichtet, linked_list in den lokalen Bereich von Raphael zu integrieren:

%Vor%

Und jetzt möchte ich linked_list Implementierung testen.

    
Elazar Leibovich 05.05.2010, 18:31
quelle

4 Antworten

12

Sie vermissen immer noch den Punkt.

Der Punkt der Komponententests besteht darin, zu verifizieren, dass die öffentliche Schnittstelle des Objekts das tut, was von ihm erwartet wird. Unit-Tests zeigen, wie der Code funktioniert.

Das einzige, was getestet werden sollte, ist die öffentliche Schnittstelle des Objekts. Wenn der Entwickler die Art und Weise ändern möchte, wie das Objekt implementiert wird, müssen Sie sich nur Gedanken darüber machen, ob das getestete Objekt immer noch das tut, was es erwartet.

Wenn Sie das Gefühl haben, dass das Objekt, das sich in diesem Verschluss befindet, getestet werden muss, dann testen Sie es, aber machen Sie es extern und geben Sie es dann in den Verschluss.

%Vor%

Unerwünschte Hacks, wie sie unten gezeigt werden, sind völlig unpassend (in Einzeltests oder überall).

Testfunktionen sollten einfach sein, nur eine Sache testen und eine Behauptung haben. Dies kann normalerweise in drei bis zehn Zeilen Testcode passieren.

Wenn Sie zu dem Punkt kommen, an dem Ihre Testfunktionen kompliziert sind, da sie dem von Ihnen gewünschten Ansatz folgen würden, dann auch nicht (1) erkenne, dass dein Design möglicherweise nicht das ist, was du willst und ändere es so, dass es es ist, oder (2) ändere deine Erwartungen im Test.

In Bezug auf den von Ihnen geposteten Code haben Sie var vergessen, ein Semikolon verpasst und zwei reservierte Wörter als Bezeichner verwendet: private und public .

Die Konsequenz, var nicht zu verwenden, ist die Möglichkeit, Fehler und Probleme im Zusammenhang mit verschiedenen Implementierungen nicht standardmäßiger GlobalScopePolluter -Typ-Objekte auszulösen ("Objekt unterstützt diese Eigenschaft oder Methode nicht" in IE). Die Folge der Verwendung eines FutureReservedWord ist SyntaxError . Die Implementierung kann eine Syntaxerweiterung für allow FutureReservedWord als Bezeichner bereitstellen, und tatsächlich tun dies viele, aber es ist am besten, sich nicht auf solche Erweiterungen zu verlassen, und wenn Sie einen Fehler bekommen, wäre es vollständig Ihre Schuld.

Sie haben erwähnt, dass Sie Benutzern Code zur Verfügung stellen. Ich schlage vor, dass Sie das nicht tun, bis Sie etwas mehr Erfahrung und Verständnis mit dem haben, was Sie tun.

%Vor%

Dieser Beispielcode dient nur als Demonstration, dass so etwas möglich ist. Angesichts der Wahl ist es eine schlechte Alternative zu den zuvor genannten Alternativen; entweder ändern Sie Ihr Design oder ändern Sie Ihre Tests.

    
Garrett 05.05.2010 21:28
quelle
2

Versuchen Sie Folgendes:

%Vor%

Nur eine kleine Funktion Injektion

    
Gutzofter 05.05.2010 20:03
quelle
1

Die beste Lösung, die ich gefunden habe:

In Quell-Javascript-Datei verwenden

%Vor%

Verwenden Sie nun ein Skript, um Objekte zwischen // start ([a-zA-Z_]*) und // end ([a-zA-Z_]*) zu extrahieren und testen Sie den extrahierten Code.

Offensichtlich ist es unmöglich, auf Variablen im inneren Bereich einer Funktion von einem äußeren Bereich aus zuzugreifen. Wie in der SO-Frage geschrieben steht Jason in den Kommentaren.

    
Elazar Leibovich 06.05.2010 04:31
quelle
0
%Vor%     
James Westgate 05.05.2010 18:36
quelle