2010-05-28 5 views
6

Ich schreibe Komponententests für ein Modul in einer kleinen Javascript-Anwendung. Um die Schnittstelle sauber zu halten, werden einige der Implementierungsdetails durch eine anonyme Funktion (das übliche JS-Muster für die Privatsphäre) geschlossen. Während des Testens muss ich jedoch auf die privaten Teile zugreifen/nachmachen/überprüfen.White-Box-Test in Javascript - Wie geht man mit der Privatsphäre um?

Die meisten der Tests, die ich vorher geschrieben habe, waren in Python, wo es keine echten privaten Variablen gibt (Mitglieder, Bezeichner, wie immer man sie nennen will). Man schlägt einfach Privatsphäre über einen führenden Unterstrich für die Benutzer vor und ignoriert sie beim Testen des Codes. In statisch getippten OO-Sprachen könnte man private Mitglieder für Tests zugänglich machen, indem man sie in geschützte Objekte umwandelt und das zu testende Objekt unterklassifiziert. In Javascript trifft Letzteres nicht zu, während Ersteres als schlechte Übung erscheint.

Ich könnte immer wieder auf Black-Box-Tests zurückgreifen und einfach die Endergebnisse überprüfen. Es ist der einfachste und sauberste Ansatz, aber leider nicht detailliert genug für meine Bedürfnisse.

Gibt es also eine Standardmethode, um Variablen privat zu halten und trotzdem einige Backdoors für das Testen in Javascript beizubehalten?

+8

Hmm, ich mag es nicht, wenn Leute meine privaten Teile verspotten – Martin

Antwort

1

Nein. Ich glaube nicht, dass es gibt. Es läuft im Grunde darauf hinaus, ob Sie den Verschluss-Ansatz nehmen und White-Box-Tests aufgeben oder White-Box-Tests durchführen und Namensdekoration für "private" Mitglieder verwenden. Eigentlich nicht nur in Python, sondern auch in Javascript verwenden zu viele Projekte den nicht so magischen Unterstrich, um Privatpersonen zu dekorieren. In gewisser Weise ist dies bereits eine allgemein akzeptierte Lösung des Problems.

Wenn Sie das nicht wollen und wirklich, wirklich, Whitebox Unit Tests benötigen, dann können Sie die Tests immer in Ihre Objekte integrieren. Wenn Sie einen separaten Build-Schritt für den Produktionscode haben (Minimierung, Anforderung/Bereitstellung, Auflösung usw.), können Sie die Testfunktionen in diesem Prozess entfernen.

+0

Nun, sieht so aus, als müsste ich doch ein bisschen Dekoration machen. Vielen Dank. Das Einbinden der Tests in den Hauptcode und das Entfernen während des Builds ist eine interessante Lösung, aber ein wenig zu chaotisch. –