Wie Teste ich die 'normalen' (nicht-Knoten-spezifischen) JavaScript-Funktionen mit Mokka?
Dieser scheint, wie es sollte sehr einfach, aber nach zwei Stunden Lesen und trial-and-error ohne Erfolg, ich bin die Niederlage einzugestehen und bitten Euch!
Ich versuche, Mokka mit Should.js zum testen einige JavaScript-Funktionen, aber ich bin mit in die scoping-Fragen. Ich habe vereinfacht es, bis auf die grundlegendste test-Fällen, aber ich kann es nicht arbeiten.
Habe ich eine Datei namens functions.js
, die enthält die folgenden:
function testFunction() {
return 1;
}
Und meine tests.js
(befindet sich im selben Ordner) Inhalt:
require('./functions.js')
describe('tests', function(){
describe('testFunction', function(){
it('should return 1', function(){
testFunction().should.equal(1);
})
})
})
Dieser test fehlschlägt, mit einem ReferenceError: testFunction is not defined
.
Ich kann sehen, warum, weil die meisten der Beispiele, die ich gefunden habe entweder befestigen Sie Objekte und Funktionen zu den Knoten global
Objekt oder exportieren, um Sie mit module.exports
—aber mit jeder dieser Ansätze bedeutet, dass meine Funktion code werfen würde Fehler in einem standard-browser situation, wo diese Objekte nicht existieren.
So, wie kann ich auf standalone-Funktionen, die deklariert werden in eine separate Skript-Datei aus meinen tests, ohne die Verwendung von Knoten-spezifische syntax?
- Haben Sie
exports.testFunction = testFunction
in Ihrem functions.js ? - Nein, der vollständige Inhalt
functions.js
angezeigt werden. Bitte die Frage nochmal Lesen—ich ausdrücklich sagen, dass ich nicht verwenden wollen-Knoten-spezifische syntax in der Quell-Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Macht das nichts, da Sie nicht exportieren nichts. Was Sie erwartet ist, dass
testFunction
Global verfügbar ist, im wesentlichen die gleichen wieDu nur nicht bypass-export/globals-Mechanismus. Es ist die Art, wie Knoten entwickelt wurde. Es gibt keine implizite Globale gemeinsamen Kontext (wie
window
auf einem browser). Alle "global" - variable in einem Modul ist in Ihr gefangen Kontext.Sollten Sie verwenden
module.exports
. Wenn Sie beabsichtigen, Sie zu teilen, dass die Datei mit einem browser-Umgebungen, gibt es Möglichkeiten, um es kompatibel. Für einen schnellen hack nur tunwindow.module = {}; jQuery.extend(window, module.exports)
im browser, oderif (typeof exports !== 'undefined'){ exports.testFunction = testFunction }
für Knoten.exports
.Danke an die anderen Antworten hier, ich habe Dinge zu arbeiten.
Einer Sache, die nicht aufgeführt war, obwohl—vielleicht, weil es allgemein bekannt ist, unter Noders—war, dass Sie zuweisen müssen, das Ergebnis der
require
Aufruf einer variable, so dass Sie nachlesen können, beim aufrufen der exportierten Funktionen in der test-suite.Hier ist mein kompletter code, für zukünftige Referenz:
functions.js
:tests.js
:Wenn Sie wollen jedem Modul zur Verfügung, durch das verlangen, die Sie verwenden sollten
wie Sie wissen 😉
gibt es eine Lösung, wenn Sie wollen, dass Sie ein Modul im Knoten und in der browser dadurch
dadurch werden Sie in der Lage zu verwenden Sie die Datei im browser und im Knoten Umgebung