2017-12-30 18 views
0

Ich habe einen Dienst, den ich versuche, Unit-Test, aber ich kann nicht zu den Funktionen im Dienst, die nur für dieses Modul privat sein sollen. Um es zu testen und auszuspionieren, muss ich diese Funktion anderen Modulen zugänglich machen. Ich fühle, dass dies den Zweck der Einkapselung vereitelt und ein Kodierungs-No-No ist.How to Encapsulate AngularJS Funktionen, aber immer noch es testbar

Diese vier Funktionen sind zum Beispiel Hilfsfunktionen und werden von keinem anderen Modul als dem, in dem sie sich befinden, verwendet. Es ist absolut sinnlos, sie in das 'vm'-Objekt einzufügen, das als' dieses 'instanziiert wird "für die Konvention. Dies macht es anderen zu verwendenden Modulen zugänglich. Ich will das nicht. Wenn meine Tests jedoch nicht erfolgreich sind, können meine Jasmintests nicht darauf zugreifen. :

enter image description here

So ist die Lösung, die alle Funktionen, die ich an alle meine anderen Module testen wollen aussetzen, so dass sie Einheit dort getestet werden kann, oder ist eine Art, wie ich diese Variablen aus meinen Tests zugreifen können, ohne auszusetzen sie zu allem.

Antwort

1

Wie Sie sagten, sollten private Funktionen nicht direkt während der Komponententests getestet werden.

Wenn sie in diesem service privat sind, bedeutet dies, dass sie innerhalb desselben service aufgerufen werden.

Also der Ort, an dem sie getestet werden, ist, wenn Sie die exponierten Funktionen testen, die sie aufrufen. Sie werden Operationen auf dem Dienst ausführen, Rückgabewert, was auch immer, so sollten Sie einfach die "exponierte Hauptmethode" testen und in diesem describe Block Sie auch testen, dass die privaten Funktionen korrekt verhalten.

Und wie Sie gesagt haben, ist die Lösung nicht, alle zu belichten. In den Diensten, Fabriken oder Controllern. Wo auch immer.

Und das nicht nur auf JS verwendet und/oder eckig, ist dies eine gängige Praxis in Unit-Tests.

Ein kurzes Beispiel.

Nehmen wir an, Sie eine Funktion im Dienst haben, die, genannt function1 ausgesetzt ist. Innerhalb dieser Methode rufen Sie eine andere Funktion, die privat ist, genannt function2, die für das Festlegen einer Eigenschaft der service verantwortlich ist (nehmen wir an, es erhöht einen Zähler durch den Dienst ausgesetzt).

So ist der Ort, an dem function2 zu testen, ist innerhalb function1. In Ihrem describe Block function1 bezogen, Sie einen anderen Block zu function2 Zusammenhang hinzufügen, und Sie einen Test hinzufügen, um zu sehen, ob der Zähler Eigenschaft nach dem Aufruf function1 erhöht.

+0

Ah okay Gotcha, ich missverstanden Unit-Tests dann. Ich dachte, es testet jede einzelne Funktion separat als "Einheit" – MatTaNg

+0

Einheit bedeutet, dass Tests atomar sein sollten, so dass jeder Test einen einzigen Aspekt abdecken sollte. Wenn Sie also eine Funktion haben, die einen Wert setzt und beispielsweise eine andere externe Funktion aufruft, sollten Sie zwei verschiedene Tests implementieren – quirimmo