Ich verwende Karma (derzeit v0.10.10) und Jasmine für meine Unit-Tests und Istanbul (über Karma-Coverage) für Code-Coverage-Berichte. Ich habe in einem bestimmten Fall ein merkwürdiges Verhalten des Code Coverage Reporters bemerkt.
Der Code, den ich testen möchte, ist ungefähr so:
%Vor% In meinem Test sende ich ein benutzerdefiniertes Eingabeereignis für das getestete Element und die Rückruffunktion wird ausgeführt . Der Test überprüft die Auswirkungen des Rückrufs und der Test wird bestanden. In der Tat, auch wenn ich einen haarigen console.log("foo")
in den Rückruf einfüge, kann ich deutlich sehen, dass es ausgedruckt wird. Der Bericht von Istanbul weist jedoch fälschlicherweise darauf hin, dass der Rückruf überhaupt nicht ausgeführt wurde .
Das Ändern des getesteten Codes für die Verwendung einer anonymen Funktion im Rückruf des Ereignis-Listeners behebt das Fehlverhalten:
%Vor%Aber ich verachte absolut "Lösungen", die den Code der Anwendung modifizieren, um den Mangel eines Codequalitätskontrollwerkzeugs zu kompensieren.
Gibt es eine Möglichkeit, die Codeabdeckung korrekt abzurufen, ohne den Rückruf in einer anonymen Funktion einzubinden?
Der Rückruf wird an Ihre Methode übergeben. Istanbul weiß nicht, woher dieser Rückruf stammt, außer von Ihrer Funktionsdefinition. Istanbul weiß, dass callback () aus dem Parameter callback
stammt, kennt aber das Innere dieses Callbacks nicht (z. B. die Funktion, bevor es als Callback übergeben wurde).
// Beispiel bearbeiten
%Vor% Erstellen Sie nun einen Test für die Funktionalität von foo und einen separaten Komponententest für die Funktionalität von callback
. Ein Komponententest sollte nur eine Sache testen. Jede Funktion sollte einen eigenen Komponententest haben. Testen Sie, dass foo
das tut, was es soll (unabhängig vom Callback) und dass der Callback das tut, was er soll (indem er seine eigenen Mock-Daten für den Test übergibt). Im Allgemeinen sind benannte Funktionen immer der richtige Weg.
Ich hatte genau dieses Problem mit Callbacks in Teilen meines Nodejs-Codes, die nicht als abgedeckt markiert wurden, obwohl ich Tests hatte, die sie definitiv abdeckten. Ich hatte dieses Problem sowohl mit Mocha / Istanbul als auch mit Mocha / Blanket.js.
Ich bemerkte schließlich, dass viele meiner Tests nicht mit Code-Coverage ausgeführt wurden, die mich zu dem Problem führten.
Ich habe es gelöst, indem ich die Option --recursive
zu mocha hinzugefügt habe, da einige Tests in Unterverzeichnissen waren.
Tags und Links javascript code-coverage callback karma-runner istanbul