Jak przeprowadzić pojedynczy test z Mocha?

291

Używam Mocha do testowania moich skryptów JavaScript. Mój plik testowy zawiera 5 testów. Czy jest możliwe uruchomienie określonego testu (lub zestawu testów) zamiast wszystkich testów w pliku?

Misza Moroszko
źródło

Odpowiedzi:

355

Spróbuj użyć opcji mokki--grep :

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

Możesz użyć dowolnego poprawnego wyrażenia regularnego JavaScript jako <pattern>. Na przykład, jeśli mamy test/mytest.js:

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

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

Następnie:

$ mocha -g 'logs a'

Aby uruchomić pojedynczy test. Zauważ, że to przechwytuje nazwy wszystkich describe(name, fn)i it(name, fn)wywołań.

Rozważ użycie zagnieżdżonych describe()wywołań przestrzeni nazw, aby ułatwić zlokalizowanie i wybranie określonych zestawów.

Asherah
źródło
1
Dzięki! Miałem wrażenie, że --grepodfiltrowałem tylko z @tagów.
kumarharsh
5
Podczas używania Mocha programowo (na przykład z Grunta), istnieje opcja catch: grep musi być obiektem „RegExp ()”. Jeśli jest to ciąg znaków, zostanie on usunięty.
h-kippo
1
to jedyne rozwiązanie, które działało dla mnie. określenie plików w linii poleceń ( mocha some/test.js) w ogóle nie działało. dzięki!
hraban
2
Jakiś sposób, aby uniknąć również uruchamiania, logs a bcdktóry zawiera logs apodciąg? Regexp ^$nie działa w wersji 0.10.2.
Ciro Santilli 26 冠状 病 六四 事件 法轮功
Dzięki. Pojawiają się błędy, jeśli nie podam katalogu, ponieważ mocha -g 'loguje a'.
kta
165

W zależności od wzorca użytkowania, możesz po prostu chcieć używać tylko . Używamy stylu TDD; To wygląda tak:

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

Tylko ten test zostanie uruchomiony ze wszystkich plików / pakietów.

J Burnett
źródło
5
BDD działa tak samo. Jest to świetne, gdy pracujesz nad jednym testem. Można go również używać na poziomie pakietu / opisywania
andyzinsser,
14
Z Chai i spodziewaj się składni it.only.
elkelk
4
Ta odpowiedź jest lepsza, ponieważ zadziała również wtedy, gdy mokka jest używana z wewnętrznej karmy itp.
Vivek Kodira
2
it.onlynie będzie współpracować z givenod mocha-testdata . Łatwo jest zapomnieć o jego późniejszym usunięciu.
Tr1et
4
eslint-plugin-mochama regułę, no-exclusive-testsktóra złapie cię, jeśli zapomnisz usunąć .only.
dostu
84

Jeśli używasz npm test(używając skryptów package.json), użyj dodatkowego, --aby przekazać parametr do mokki

na przykład npm test -- --grep "my second test"

EDYCJA : Wygląda na to, że --grepmoże być trochę wybredna (prawdopodobnie w zależności od innych argumentów). Możesz:

Zmodyfikuj plik package.json:

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

Lub alternatywnie użycie, --bailktóre wydaje się mniej wybredne

npm test -- --bail
Ashley Coolman
źródło
3
Pracował dla mnie. Dzięki :)
Jill-Jênn Vie
1
@Andy --grep może być trochę wybredny - spróbuj umieścić go zaraz po mokce we wpisie skryptu npm. W przeciwnym razie npm test -- --bailprzydaje się zwolnienie za kaucją po pierwszym nieudanym teście
Ashley Coolman
1
mijając dodatkowe kreski, zanim --grepuratowałem mój dzień! Wielkie dzięki. PS. Korzystam z systemu Windows, działamnpm test -- --grep @tag
Mykola
18

uruchom pojedynczy test - według nazwy pliku -

W rzeczywistości można również uruchomić pojedynczy test mokki według nazwy pliku (nie tylko „it () - string-grepping”), jeśli usuniesz wzór globu (np. ./test/**/*.spec.js) Z pliku mocha.opts, odpowiednio utworzysz kopię bez:

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

Oto moja mocha.single.opts (różni się tylko brakiem wspomnianej linii glob)

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

Tło: Chociaż możesz przesłonić różne przełączniki z pliku opts (zaczynając od --), nie możesz przesłonić globu . Ten link zawiera również wyjaśnienia.

Wskazówka: jeśli node_modules/.bin/mochacię myli, skorzystaj z lokalnego pakietu mokka. Możesz także napisać tylko mocha, jeśli masz zainstalowany globalnie.


A jeśli chcesz wygody package.json: Ciągle: usuń **/*-ish glob z twojego mocha.opts, włóż je tutaj, na wszystkie testy, zostaw je dla pojedynczego testu:

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

stosowanie:

> npm run test

odpowiednio

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

(uwaga --!)

Frank Nocke
źródło
1 USD nie był potrzebny w mojej konfiguracji, zamiast tego doprowadził do ostrzeżeń takich jak: Warning: Could not find any test files matching pattern: $1
Merijn Vogel
15

Wystarczy użyć .only tylko przed „opisz”, „to” lub „kontekst”. Uruchamiam za pomocą „$ npm run test: unit” i wykonuje tylko jednostki z .only.

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

it.only('should return 1', function() {
  // ...
});
QauseenMZ
źródło
11

Cześć powyższe rozwiązania nie działały dla mnie. Innym sposobem przeprowadzenia pojedynczego testu jest

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

Pomaga to uruchomić przypadek testowy z jednego pliku o określonej nazwie.

Ruthreshwar
źródło
1
Użyj wyrażenia, które jest wystarczająco selektywne -gi nie będziesz musiał określać nazwy pliku. Jeśli nie możesz napisać wyrażenia, które jest wystarczająco selektywne, oznacza to, że nie nazywasz poprawnie swoich testów.
Louis
10
npm test <filepath>

np .:

npm test test/api/controllers/test.js

tutaj 'test / api / controllers / test.js' jest ścieżką do pliku.

Jitendra Pawar
źródło
8

Możesz spróbować „it.only”

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

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

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

w tym wykona się tylko pierwszy

Bikesh M
źródło
2
Niebezpieczne, jeśli testy nie są wykonywane --forbid-onlyna serwerze CI / build. .onlyma tendencję do zakradania się do głównej gałęzi i wyciszania innych testów, ponieważ po prostu nie będą się już uruchamiać. Zacząłem myśleć o przepływie pracy zmieniającym się kodzie, aby uruchamiać różne testy antyfunkcyjne. Testujący powinien określić, które testy należy wykonać (testy oznaczone tagami), a nie programistę.
k0pernikus
Użyłem tego do testowania jednej funkcjonalności w moim lokalnym, Uwaga: nie zatwierdzaj kodu it.onlydo repo
Bikesh M
0

Nie jestem pewien, dlaczego metoda grep nie działa dla mnie podczas korzystania z testu npm. Ale to działa. Z jakiegoś powodu muszę również określić folder testowy.

test npm - test / sometest.js

Andy N.
źródło
0

Skonsoliduj wszystkie testy w jednym pliku test.js, a twój pakiet json dodaj skrypty jako:

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

Wpisz polecenie w katalogu testowym:

npm run api:test
Shahin
źródło