2016-12-28 1 views
2

In meinem package.json habe ich die folgenden;npm test unterscheidet sich von der manuellen Ausführung

"scripts": { 
    "test": "NODE_ENV=test mocha **/*.spec.js" 
} 

Wenn ich npm test laufen sie abgeschlossen ist nur ein Test in meiner Unterverzeichnisse.

# npm test 

sample test 
    ✓ single task 

1 passing 

Aber wenn ich das Skript manuell in meiner Konsole ausführen, schließt es alle Tests ab.

# NODE_ENV=test mocha **/*.spec.js 

sample test 
    ✓ single task 

sample test x2 
    ✓ single task x1 
    ✓ single task x2 
    ✓ single task x3 
    ✓ single task x4 
    ✓ single task x5 

sample test x3 
    ✓ single task x1 
    ✓ single task x2 
    ✓ single task x3 
    ✓ single task x4 
    ✓ single task x5 
    ✓ single task x6 

sample test x4 
    ✓ single task x1 
    ✓ single task x2 
    ✓ single task x3 
    ✓ single task x4 


16 passing (15s) 

Warum gibt es einen Unterschied, wenn derselbe Befehl ausgeführt wird? und wie bekomme ich npm test, um alle meine Tests durchzuführen?

+1

Ist 'Mokka' in deinen' devDependencies'? Was passiert, wenn Sie die Befehle so ändern, dass sie sowohl in Ihrem Terminal als auch im Test-Skript einfach "mocha --version" sind? Unterscheiden sich die Versionen? Ich vermute, sie tun es. Möglicherweise ist einer von ihnen fehlerhaft. Um eine Aktualisierung der lokalen Kopie von 'mocha' zu erzwingen, vergewissern Sie sich, dass' devDependencies' die neueste Version hat, dann tun Sie 'rm -rf node_modules && npm Cache sauber && npm install' –

+0

' mocha' Version ist die gleiche in beiden 'npm 'und manuell. '3.2.0'. Hatte bereits versucht, Mocha neu zu installieren. Ich habe es wieder mit deinen Befehlen gemacht, um sicher zu sein, dasselbe. Immer noch nur ein Testlauf. – sketchthat

+0

Sind Sie zufällig auf Windows? Welches Terminalprogramm läuft und welche Shell (versuche 'echo $ 0')? Ist der 'NODE_ENV' wirklich wichtig für deinen Code? Wenn Sie diese Umgebungsvariable nicht richtig setzen oder exportieren, was würden Sie erwarten? Ich bin auch neugierig, was passieren wird, wenn Sie das Glob-Muster in etwas wie "NODE_ENV = test mocha test/*. Spec.js" (nicht-rekursive Datei-Wildcard) ändern. Es scheint etwas mit Globbing zu tun zu haben. –

Antwort

2

Dies ist ein bekanntes Problem, verursacht durch die Syntax, die Mocha für globbing verwendet, die auf vielen Computern mit dem Globbing-System der Shell selbst kollidiert. Und wenn Sie nicht vorsichtig sind, wird die Shell sie zuerst auswerten und erweitern, bevor Mocha überhaupt eine Chance hat, sie zu sehen.

Die Lösung ist Ihre Shell zu sagen, das Muster als Stringliteral, zu behandeln, indem sie in Anführungszeichen wickeln. Einfache Anführungszeichen sind am besten auf * nix-Systemen. Wenn Sie Windows-Unterstützung benötigen, müssen Sie auf escaped double quotes zurückgreifen, die einige Fehler auf * nix hat.

NODE_ENV=test mocha '**/*.spec.js' 

Sie müssen immer noch sicherstellen, dass das Muster Dateien richtig entspricht. Aber mit dieser Technik wird das inkonsistente Verhalten behoben. Der Unterschied im Verhalten wird durch die Art und Weise verursacht, wie npm Ihr test Skript umschließt und es ausführt.

Möglichkeiten zu helfen:

Beachten Sie, dass andere CLI-Tools, die auf glob verlassen, wie eslint, sind auch anfällig für dieses Problem und die Problemumgehung gilt auch für sie.

+0

Danke für die Erklärung und die Antwort. – sketchthat

Verwandte Themen