Zmień domyślny limit czasu dla mokki

161

Jeśli mamy plik testu jednostkowego my-spec.js i działający z mokką:

mocha my-spec.js

Domyślny limit czasu wynosi 2000 ms. Można go nadpisać na potrzeby częściowego testu za pomocą parametru wiersza poleceń:

mocha my-spec.js --timeout 5000

Czy można globalnie zmienić domyślny limit czasu dla wszystkich testów? tj. domyślna wartość limitu czasu będzie inna niż 2000 ms, gdy zadzwonisz:

mocha my-spec.js
lm.
źródło
Oficjalna strona internetowa Mocha również wyjaśnia więcej na ten temat.
RaviRokkam

Odpowiedzi:

305

Domyślnie Mocha odczyta plik o nazwie, test/mocha.optsktóry może zawierać argumenty wiersza poleceń. Możesz więc stworzyć taki plik, który zawiera:

--timeout 5000

Za każdym razem, gdy uruchomisz Mocha w wierszu poleceń, odczyta ten plik i domyślnie ustawi limit czasu na 5 sekund.

Innym sposobem, który może być lepszy w zależności od sytuacji, jest ustawienie tego w następujący sposób describew wywołaniu najwyższego poziomu w pliku testowym:

describe("something", function () {
    this.timeout(5000); 

    // tests...
});

Umożliwiłoby to ustawienie limitu czasu tylko dla każdego pliku.

Możesz użyć obu metod, jeśli chcesz globalnej wartości domyślnej 5000, ale ustawić coś innego dla niektórych plików.


Pamiętaj, że generalnie nie możesz używać funkcji strzałek, jeśli masz zamiar zadzwonić this.timeout(lub uzyskać dostęp do dowolnego innego członka zestawu thisMocha). Na przykład to zwykle nie zadziała :

describe("something", () => {
    this.timeout(5000); //will not work

    // tests...
});

Dzieje się tak, ponieważ funkcja strzałkowa pobiera thiszakres, w którym występuje funkcja. Mocha wywoła funkcję z dobrą wartością, thisale ta wartość nie jest przekazywana wewnątrz funkcji strzałkowej. Dokumentacja dla Mocha mówi na ten temat :

Odradza się przekazywanie funkcji strzałkowych („lambd”) do Mocha. Ze względu na leksykalne powiązanie tego, takie funkcje nie są w stanie uzyskać dostępu do kontekstu Mocha.

Louis
źródło
1
Dzięki za informacje. Ale próbowałem zmodyfikować plik mocha.opts, ale nie ma to wpływu.
lm.
2
Czy stworzyłeś go we właściwym miejscu? Mocha bardzo dokładnie określa, gdzie chce ten plik. Jeśli uruchomisz Mocha, /home/me/src/proj/Mocha będzie szukać tego pliku:/home/me/src/proj/test/mocha.opts
Louis
Wielkie dzięki . Teraz zmiana dotyczyła
lm.
this.timeout (10000); // domyślny limit czasu ^ TypeError: this.timeout nie jest funkcją w Suite. <anonymous> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery
6
@JeffLowery Czy używasz funkcji strzałek? Funkcje strzałkowe nie ustanawiają nowego this, co zwykle kończy się this.timeoutniepowodzeniem, jak widać w komentarzu.
Louis
62

Po prostu dodając do poprawnej odpowiedzi, możesz ustawić limit czasu za pomocą funkcji strzałki w następujący sposób:

it('Some test', () => {

}).timeout(5000)
Denis
źródło
7
Pytanie brzmi „globalna zmiana domyślnego limitu czasu dla wszystkich testów”. Twoja odpowiedź zmienia tylko jeden test. describe('suite', () => {...}).timeout(5000)nie działa.
aleung
Podobnie jak w poprzedniej odpowiedzi, proponowane rozwiązanie jest obecnie nieskuteczne. mochajs.org/#timeouts nakazuje wstawianie jawnych setTimeoutinstrukcji do testów.
Marco Faustinelli
to zadziałało dla mnie z mokką @ 5 (do konkretnego testu)
Fernando Gabrieli
@MarcoFaustinelli Nie rozumiesz dokumentów. SetTimeouts nie ma nic wspólnego z Mocha. Są po to, aby zademonstrować efekty ustawień limitu czasu.
oligofren
33

Dodając to dla kompletności. Jeśli (tak jak ja) używasz skryptu w swoim package.jsonpliku, po prostu dodaj --timeoutopcję do mocha:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

Następnie możesz uruchomić npm run testzestaw testów z limitem czasu ustawionym na 10000 milisekund.

Wolność_Ben
źródło
Jeśli ktoś jest zainteresowany, większość IDE pozwala także na wprowadzenie opcji mokki w celu wykonania testów; np. w przypadku WebStorm, możesz wpisać to (tj. „--timeout 10000”) w Run-> Edit Configurations-> Extra Mocha Options.
Rubicon
25

W obecnych wersjach Mocha limit czasu można zmienić globalnie w następujący sposób:

mocha.timeout(5000);

Po prostu dodaj powyższą linię w dowolnym miejscu zestawu testów, najlepiej u góry specyfikacji lub w osobnym pomocniku testowym.


W starszych wersjach i tylko w przeglądarce można było zmienić konfigurację globalną za pomocą mocha.setup.

mocha.setup({ timeout: 5000 });

Dokumentacja nie obejmuje globalne ustawienie limitu czasu, ale oferuje kilka przykładów, w jaki sposób zmienić czas w innych typowych scenariuszy.

GOTO 0
źródło
5
To nie działa w Node. Zobacz stackoverflow.com/a/47915119/893113 . Wygląda na to, że opcja CLI jest jedynym sposobem.
paulmelnikow
W przeglądarce też nie działa. Na dzień dzisiejszy dokumentacja, do której link znajduje się w odpowiedzi, nie wymienia żadnego timeoutparametru. Wręcz przeciwnie, mochajs.org/#timeouts nakazuje wstawianie jawnych setTimeoutinstrukcji do testów.
Marco Faustinelli
@MarcoFaustinelli Nie rozumiesz dokumentów. SetTimeouts nie ma nic wspólnego z Mocha. Są po to, aby zademonstrować efekty ustawień limitu czasu.
oligofren