2012-06-16 9 views
8

Kurze und scheinbar dumme Frage, weil so einfach und du denkst allgegenwärtig: hat jemand irgendeine Art von Code Coverage in einem RequireJS Frontend-Projekt (non NodeJS) arbeiten?JavaScript-Code Abdeckung in RequireJS/AMD-Module

Scheint wie eine dumme Frage wegen der Vorherrschaft von TDD-Ansätze in der JS-Welt und die Übernahme von AMD-Entwicklung.

Ich habe eine Million Ansätze versucht, alle fehlen. Mein Projekt ist ein Backbone-Projekt mit Jasmine Unit Tests:

1) JSTD mit Coverage-Plugin. JSTD hat Schwierigkeiten, AMD-Module ordnungsgemäß zu laden und zu instrumentieren. Wenn ich JSTD in einer einzigen js-Datei (kombiniert mit RequireJS-Optimierer) ausführe, funktioniert die Code-Abdeckung wunderbar, AUSSER die Abdeckung wird dann gesammelt und die Metriken in der GESAMTEN Datei definiert. Großartig, das ist nutzlos, weil Bibliotheken von Drittanbietern enthalten sind, und weil ich keine einzelne Einheit anvisieren kann, um die Entwicklung zu testen. Argh.

2) JSCoverage - insgesamt fehlgeschlagen, mag AMD-Module nicht.

3) Chrome spezifische & Firebug spezifische 'live' Instrumentierer - scheitern, mögen keine AMD-Module.

Jeder Ansatz, den ich versuche, scheint große Mengen an benutzerdefinierten Arbeiten zu erfordern. Also vielleicht muss ich eine benutzerdefinierte Lösung von Grund auf neu drehen?

Wie wäre es mit dem folgenden Ansatz: Erweitern Sie den RequireJS-Optimierer auf Gerätecode und erstellen Sie Abdeckung. Dies wäre eine In-Memory-Instrumentierung, die mit einem Flag require.config ({instrument: true}) aktiviert werden kann. Jedes Mal, wenn ein Modul geladen wird, wird es automatisch instrumentiert und in seinem Modul-Repository abgelegt. Coverage-Statistiken werden in einem Objekt unter dem globalen require-Objekt gesammelt und sind von überall zugänglich, zum Beispiel nach einem Jasmine-Testlauf.

Eingabe?

+0

Codeabdeckung ist nicht trivial zu implementieren. Sie müssen AST Hacker mit etwas wie Bunker tun. – Raynos

+0

Einverstanden. Aus diesem Grund habe ich begonnen, vorhandene AST & Instrumentierungsbibliotheken (Esprima, Node-Cover) zu verwenden. Ich habe die meisten der RequireJS-Code-Änderungen gemacht und arbeite an der Instrumentierung & Berichterstattung Sammlungsteil. – Bernardo

Antwort

6

Blanket.js Arbeiten mit QUnit Verwendung basiert ein modifizierter RequireJS Loader. Wir arbeiten an der Jasmine-Unterstützung und nehmen gerne Rückmeldungen oder Vorschläge entgegen.

Wenn Ihr Projekt in Produktion geht, ist Blanket.js nicht für Sie, aber wenn es nur ein Nebenprojekt ist, könnte es sich sehen lassen, wenn es Ihren Anforderungen entspricht.

EDIT: Blanket unterstützt nun Jasmine.

+0

Wo ist die Dokumentation von Blankets Unterstützung von Jasmin mit requireJS? Ich sehe die Qunit-Dokumentation dazu, aber nicht Jasmin. – rball

3

Nun, es stellt sich heraus, Node-Coverage bietet tatsächlich eine AMD agnostic Schnittstelle, die gut mit RequireJS und Jasmine funktioniert, indem sie den Code von seinem eigenen Server instrumentiert werden.

Ich werde noch einige Zeit an der von mir gestarteten RequireJS-Coverage-Implementierung arbeiten, da es keinen separaten Server erfordert.

2

Was genau ist Ihr Problem mit AMD-Modulen und JSCoverage? Ich habe ein Setup (QUnit/PhantomJS/JSCoverage) mit AMD-Modulen laufen.

Vielleicht haben Sie gerade vergessen, Ihre Bibliothekspfade korrekt in Ihrer require.config einzurichten?

Nachdem ich die Bibliothekspfade geändert habe, um den instrumentierten Code anstelle der "normalen" Dateien zu verwenden, funktionierte alles.

2

mochawrapper

Ich schrieb ein Knotenmodul, die Berichterstattung Reporting automatisiert. Es basiert auf Mocha, Jscoverage und Node's Assert. Sie müssen weder require noch make oder environnment-Variablen verwenden.

Es ist auf Github gehostet wird: mochawrapper

jscoverage vielleicht nicht im Browser läuft, so dass Sie wollen, betrachten können: bunker die auf uglify-js