Wie führe ich einen einzelnen Test mit Mokka durch?


291

Ich benutze Mocha, um meine JavaScript-Inhalte zu testen. Meine Testdatei enthält 5 Tests. Ist es möglich, einen bestimmten Test (oder eine Reihe von Tests) anstelle aller Tests in der Datei auszuführen?

Antworten:


355

Versuchen Sie es mit der --grepOption von Mokka :

    -g, --grep <pattern>            only run tests matching <pattern>

Sie können jeden gültigen JavaScript-Regex als verwenden <pattern>. Zum Beispiel, wenn wir haben test/mytest.js:

it('logs a', function(done) {
  console.log('a');
  done();
});

it('logs b', function(done) {
  console.log('b');
  done();
});

Dann:

$ mocha -g 'logs a'

So führen Sie einen einzelnen Test durch Beachten Sie, dass dies die Namen aller describe(name, fn)und Aufrufe erfasst it(name, fn).

Erwägen Sie die Verwendung verschachtelter describe()Aufrufe für den Namespace, um das Auffinden und Auswählen bestimmter Gruppen zu vereinfachen.


1
Vielen Dank! Ich hatte den Eindruck, dass --grepnur aus den @Tags gefiltert .
Kumarshar

5
Wenn Sie Mocha programmgesteuert verwenden (zum Beispiel von Grunt), gibt es einen Haken: Die Option grep muss ein ´RegExp () ´ -Objekt sein. Wenn es sich um eine Zeichenfolge handelt, wird sie maskiert.
h-kippo

1
Dies ist die einzige Lösung, die für mich funktioniert hat. Das Angeben von Dateien in der Befehlszeile ( mocha some/test.js) funktionierte überhaupt nicht. Vielen Dank!
Hraban

2
Gibt es eine Möglichkeit zu vermeiden, dass auch ausgeführt wird, logs a bcddie den logs aTeilstring enthält ? Regexp ^$funktioniert nicht mit 0.10.2.
Ciro Santilli 法轮功 冠状 病 六四 事件 26

Vielen Dank. Ich erhalte einige Fehler, wenn ich das Verzeichnis nicht als mocha -g 'logs a' spezifiziere.
kta

165

Je nach Ihrem Nutzungsmuster, können Sie nur nutzen möchten nur . Wir verwenden den TDD-Stil; es sieht aus wie das:

test.only('Date part of valid Partition Key', function (done) {
    //...
}

Nur dieser Test wird von allen Dateien / Suites ausgeführt.


5
BDD funktioniert genauso. Dies ist ideal, wenn Sie an einem einzelnen Test arbeiten. Es kann auch auf der Suite / Beschreibungsebene verwendet werden
andyzinsser

14
Mit Chai und erwarten Sie Syntax das wäre it.only.
Elkelk

4
Diese Antwort ist besser, da sie auch funktioniert, wenn Mokka aus dem Inneren von Karma usw. verwendet wird.
Vivek Kodira

2
it.onlyfunktioniert nicht zusammen mit givenden Mokka-Testdaten . Und es ist leicht zu vergessen, es später zu entfernen.
Tr1et

4
eslint-plugin-mochahat eine Regel, no-exclusive-testsdie Sie fängt, wenn Sie vergessen, zu entfernen .only.
Dostu

84

Wenn Sie npm test(mit package.json-Skripten) verwenden, verwenden Sie ein Extra --, um den Parameter an mocha weiterzuleiten

z.B npm test -- --grep "my second test"

EDIT : Sieht aus wie --grepkann ein wenig pingelig sein (wahrscheinlich abhängig von den anderen Argumenten). Sie können:

Ändern Sie die package.json:

"test:mocha": "mocha --grep \"<DealsList />\" .",

Oder alternativ verwenden, --bailwas weniger pingelig zu sein scheint

npm test -- --bail

3
Hat für mich gearbeitet. Danke :)
Jill-Jênn Vie

1
@Andy --grep kann etwas pingelig sein - versuchen Sie es direkt nach Mokka im npm- Skripteintrag . Andernfalls npm test -- --bailist es nützlich, nach dem ersten fehlgeschlagenen Test
Ashley Coolman

1
zusätzliche Striche zu machen, bevor --grepmein Tag gerettet wurde! Vielen Dank. PS. Ich bin unter Windows und laufenpm test -- --grep @tag
Mykola

18

Führen Sie einen einzelnen Test durch - nach Dateiname -

Tatsächlich kann man auch einen einzelnen Mokka-Test nach Dateinamen ausführen (nicht nur nach „it () - String-Grepping“), wenn Sie das Glob-Muster (z. B. ./test/**/*.spec.js) aus Ihren mocha.opts entfernen bzw. eine Kopie erstellen, ohne:

node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js

Hier ist meine mocha.single.opts (es ist nur anders, wenn die oben genannte Glob-Linie fehlt)

--require ./test/common.js
--compilers js:babel-core/register
--reporter list
--recursive

Hintergrund: Während Sie die verschiedenen Schalter aus der opts-Datei (beginnend mit --) überschreiben können , können Sie den Glob nicht überschreiben . Dieser Link enthält auch einige Erklärungen.

Hinweis: Wenn node_modules/.bin/mochaSie verwirrt sind, verwenden Sie das lokale Paket Mokka. Sie können auch nur schreiben mocha, wenn Sie es global installiert haben.


Und wenn Sie den Komfort von package.json: Trotzdem: Entfernen Sie den **/*-ish Glob von Ihrem mocha.opts, fügen Sie sie hier ein, für alle Tests, lassen Sie sie für die einzelnen Tests weg:

"test": "mocha ./test/**/*.spec.js",
"test-watch": "mocha -R list -w ./test/**/*.spec.js",
"test-single": "mocha $1",
"test-single-watch": "mocha -R list -w $1",

Verwendung:

> npm run test

beziehungsweise

> npm run test-single -- test/ES6.self-test.spec.js 

(Beachten Sie die --!)


$ 1 wurde in meinem Setup nicht benötigt, stattdessen führte es zu Warnungen wie: Warning: Could not find any test files matching pattern: $1
Merijn Vogel

15

Verwenden Sie einfach .nur vor 'beschreiben', 'es' oder 'Kontext'. Ich führe "$ npm run test: unit" aus und es werden nur Einheiten mit .only ausgeführt.

describe.only('get success', function() {
 // ...
});

it.only('should return 1', function() {
  // ...
});

11

Hallo, obige Lösungen haben bei mir nicht funktioniert. Die andere Möglichkeit, einen einzelnen Test auszuführen, ist

mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'

Dies hilft, einen Testfall aus einer einzelnen Datei mit einem bestimmten Namen auszuführen.


1
Verwenden Sie einen Ausdruck, der selektiv genug ist -gund für den Sie keinen Dateinamen angeben müssen. Wenn Sie keinen Ausdruck schreiben können, der selektiv genug ist, bedeutet dies, dass Sie Ihre Tests nicht richtig benennen.
Louis

10
npm test <filepath>

z.B :

npm test test/api/controllers/test.js

Hier ist 'test / api / controller / test.js' der Dateipfad.


8

Sie können "it.only" versuchen

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

In diesem Fall wird nur der erste ausgeführt


2
Gefährlich, wenn Tests nicht über --forbid-onlyden CI / Build-Server ausgeführt werden. .onlyhat die Tendenz, sich in den Hauptzweig zu schleichen und die anderen Tests stumm zu schalten, da sie einfach nicht mehr ausgeführt werden. Ich dachte an den Workflow, Code zu ändern, um verschiedene Tests als Anti-Feature auszuführen. Der Testläufer sollte bestimmen, welche Tests ausgeführt werden sollen (auch als getaggte Tests bezeichnet), nicht der Entwickler.
k0pernikus

Ich habe dies zum Testen einer Funktionalität in meinem lokalen verwendet. Hinweis: it.only
Schreiben Sie keinen


0

Ich bin mir nicht sicher, warum die grep-Methode bei Verwendung des npm-Tests bei mir nicht funktioniert. Dies funktioniert jedoch. Ich muss auch den Testordner aus irgendeinem Grund angeben.

npm test - test / sometest.js


0

Konsolidieren Sie alle Ihre Tests in einer test.js-Datei und fügen Sie Ihrem Paket json Skripte hinzu als:

  "scripts": {
  "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
},

Geben Sie den Befehl in Ihr Testverzeichnis ein:

npm run api:test
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.