Come eseguire un singolo test con Mocha?


292

Uso Mocha per testare le mie cose JavaScript. Il mio file di test contiene 5 test. È possibile eseguire un test specifico (o una serie di test) anziché tutti i test nel file?

Risposte:


355

Prova a usare l' --grepopzione moka :

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

Puoi usare qualsiasi regex JavaScript valido come <pattern>. Ad esempio, se abbiamo test/mytest.js:

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

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

Poi:

$ mocha -g 'logs a'

Per eseguire un singolo test. Si noti che questo si insinua tra i nomi di tutti describe(name, fn)e le it(name, fn)invocazioni.

Prendi in considerazione l'utilizzo di describe()chiamate nidificate per lo spazio dei nomi per facilitare l'individuazione e la selezione di insiemi particolari.


1
Grazie! Avevo l'impressione che --grepfiltrasse solo dai @tag.
Kumarharsh,

5
Quando si utilizza Mocha a livello di codice (ad esempio da Grunt), c'è un problema: l'opzione grep deve essere un oggetto "RegExp ()". Se è una stringa, verrà salvata.
h-kippo,

1
questa è l'unica soluzione che ha funzionato per me. la specifica dei file dalla riga di comando ( mocha some/test.js) non ha funzionato affatto. Grazie!
hraban,

2
Un modo per evitare anche l'esecuzione logs a bcdche contiene la logs asottostringa? Regexp ^$non funziona su 0.10.2.
Ciro Santilli 26 冠状 病 六四 事件 法轮功

Grazie. Ottengo alcuni errori se non specifico directory come mocha -g 'logs a'.
kta,

166

A seconda del modello di utilizzo, ti potrebbe piacere solo utilizzare solo . Usiamo lo stile TDD; sembra così:

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

Solo questo test verrà eseguito da tutti i file / suite.


5
BDD funziona allo stesso modo. Questo è ottimo per quando stai lavorando su un singolo test. Può anche essere usato a livello di suite / descrizione
andyzinsser,

14
Con chai e aspettati che sarebbe la sintassi it.only.
elkelk

4
Questa risposta è migliore poiché funzionerà anche quando la moka viene utilizzata dall'interno del karma, ecc.
Vivek Kodira

2
it.onlynon funziona insieme con givendi moka-testdata . Ed è facile dimenticare di rimuoverlo in seguito.
Tr1et,

4
eslint-plugin-mochaha una regola no-exclusive-testsche ti catturerà se ti dimentichi di rimuoverlo .only.
dostu,

84

Se stai usando npm test(usando gli script package.json) usa un extra --per passare il parametro attraverso mocha

per esempio npm test -- --grep "my second test"

EDIT : Sembra che --greppossa essere un po 'esigente (probabilmente a seconda degli altri argomenti). Puoi:

Modifica il pacchetto.json:

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

O in alternativa usa quello --bailche sembra essere meno esigente

npm test -- --bail

3
Ha funzionato per me. Grazie :)
Jill-Jênn Vie

1
@Andy --grep può essere un po 'pignolo - prova a metterlo subito dopo la moka nella voce dello script npm. Altrimenti npm test -- --bailè utile per il salvataggio dopo il primo test fallito
Ashley Coolman,

1
passando trattini extra prima di avermi --grepsalvato la giornata! Molte grazie. PS. Sono su Windows, in esecuzionenpm test -- --grep @tag
Mykola il

18

esegui test singolo –nomefile–

In realtà, si può anche eseguire un singolo test mocha per nome file (non solo per "it () - string-grepping") se si rimuove il modello glob (ad esempio ./test/**/*.spec.js) da mocha.opts, rispettivamente si crea una copia, senza:

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

Ecco il mio mocha.single.opts (è diverso solo mancando la suddetta linea glob)

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

Sfondo: mentre puoi sovrascrivere i vari switch dal file opts (a partire da --) non puoi ignorare il glob . Questo link ha anche alcune spiegazioni.

Suggerimento: se node_modules/.bin/mochati confonde, usa il pacchetto locale mocha. Puoi anche scrivere solo mochase lo hai installato a livello globale.


E se desideri il comfort di package.json: Still: rimuovi il **/*glob -ish dal tuo mocha.opts, inseriscilo qui, per tutti i test, lasciali via per i singoli test:

"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",

utilizzo:

> npm run test

rispettivamente

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

(attenzione al --!)


$ 1 non era necessario nella mia configurazione, invece, ha portato ad avvertimenti come: Warning: Could not find any test files matching pattern: $1
Merijn Vogel

15

Basta usare .solo prima di 'descrivi', 'esso' o 'contesto'. Corro usando "$ npm run test: unit", ed esegue solo le unità con .only.

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

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

11

Salve soluzioni sopra non ha funzionato per me. L'altro modo di eseguire un singolo test è

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

Ciò consente di eseguire un caso di test da un singolo file e con un nome specifico.


1
Utilizzare un'espressione sufficientemente selettiva per -ge non sarà necessario specificare un nome file. Se non riesci a scrivere un'espressione abbastanza selettiva, significa che non stai nominando correttamente i test.
Louis,

10
npm test <filepath>

per esempio :

npm test test/api/controllers/test.js

qui 'test / api / controllers / test.js' è il percorso del file.


8

Puoi provare "it.only"

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

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

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

in questo verrà eseguito solo il primo


2
Pericoloso se i test non vengono eseguiti tramite --forbid-onlyil server CI / build. .onlyha la tendenza a intrufolarsi nel ramo principale e rendere muti gli altri test in quanto non eseguiranno più. Sono venuto a pensare al flusso di lavoro di modifica del codice per eseguire diversi test e anti-funzionalità. Il test runner dovrebbe determinare quali test devono essere eseguiti (ovvero test con tag) e non lo sviluppatore.
k0pernikus,

L'ho usato per testare una funzionalità nel mio locale, Nota: non eseguire il commit del codice con it.onlyrepo
Bikesh M


0

Non sono sicuro del motivo per cui il metodo grep non funziona per me quando si utilizza npm test. Questo funziona però. Ho anche bisogno di specificare la cartella di prova anche per qualche motivo.

npm test - test / sometest.js


0

Consolida tutti i tuoi test in un file test.js e il tuo pacchetto json aggiunge script come:

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

Digita command nella tua directory di test:

npm run api:test
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.