Używam lalkarza i żartuję, żeby przeprowadzić testy frontonu.
Moje testy wyglądają następująco:
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
Czasami, gdy uruchamiam testy, wszystko działa zgodnie z oczekiwaniami. Innym razem pojawia się błąd:
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21
at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
To dziwne, ponieważ:
Podałem limit czasu na 30000
To, czy dostaję ten błąd, jest pozornie bardzo przypadkowe
Czy ktoś może zgadnąć, dlaczego tak się dzieje?
Odpowiedzi:
Limit czasu określony w tym miejscu musi być krótszy niż domyślny limit czasu.
Domyślny limit czasu to,
5000
a ramka domyślnie jestjasmine
w przypadkujest
. Możesz określić limit czasu w teście, dodającAle byłoby to specyficzne dla testu. Lub możesz skonfigurować plik konfiguracyjny dla frameworka.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Zobacz także ten wątek
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
Błąd pisowni PS
setupFilesAfterEnv
(tj.setupFileAfterEnv
) Spowoduje także zgłoszenie tego samego błędu.źródło
setupTestFrameworkScriptFile
zostało zastąpionesetupFilesAfterEnv
, więc staje sięsetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
można go dodać do pojedynczego testu przypadku krawędzi, więc cała konfiguracja nie musiała się zmieniać :)jest.setTimeout(30000);
wjest.config.js
otrzymuję „ReferenceError: jest nie jest zdefiniowana”. Próbowałem dodać,const jest = require("jest");
ale potem pojawia się komunikat „TypeError: jest.setTimeout nie jest funkcją”.setupFilesAfterEnv
argument wjest.config.js
powinien wskazywać na inny plik, w którym umieściliśmyjest.setTimeout(30000)
opcję. Fajnie, że możemy to skonfigurować, ale wydaje mi się to trochę skomplikowane.Powinien wywoływać,
async/await
kiedy jest asynchroniczny z testu.źródło
done
funkcję asynchroniczną? Czy nie zwracamy po prostu Obietnicy czy niezdefiniowanej?page.click
. done () jest używane, przynajmniej w moim przypadku, głównie do testowania z wywołaniami zwrotnymi.done
oddzwonienie, które nie jest potrzebne.done
w tym przypadku nazwanego ) w wywołaniu zwrotnym powoduje, że Jest czeka na wywołanie tego parametru. Jego obecność jest znacząca, nawet jeśli nie jest używana.Odpowiedź na to pytanie zmieniła się w miarę ewolucji Jest. Aktualna odpowiedź (marzec 2019 r.):
Możesz zastąpić limit czasu dowolnego testu, dodając trzeci parametr do parametru
it
. to znaczy.it('runs slow', () => {...}, 9999)
Możesz zmienić domyślną za pomocą
jest.setTimeout
. Aby to zrobić:i
done
podejście asynchroniczne / oczekiwanie nie jest konieczne.źródło
Chciałbym dodać (to trochę za długo na komentarz), że nawet po przekroczeniu limitu
3000
moich testów czasami (losowo) zawodziDzięki świetnej odpowiedzi @ Tarun uważam, że najkrótszym sposobem na naprawienie wielu testów jest:
źródło
jest.setTimeout()
środkabeforeEach
, wystarczy raz zadzwonić do wszystkich testów.Jest to stosunkowo nowa aktualizacja, ale jest o wiele prostsza. Jeśli używasz wersji 24.9.0 lub nowszej, możesz po prostu dodać
testTimeout
do swojej konfiguracji:źródło
Pamiętaj, aby wywoływać
done();
wywołania zwrotne, aby nie przejść testu.Dotyczy wszystkich innych funkcji, które mają wywołanie zwrotne done ().
źródło
W przypadku wersji 24.9+ można również ustawić limit czasu z wiersza poleceń, dodając
--testTimeout
Oto fragment jego dokumentów
źródło
Niedawno natknąłem się na ten problem z innego powodu: uruchamiałem niektóre testy synchronicznie
jest -i
, i to po prostu limit czasu. Z jakiegokolwiek powodu uruchomienie tych samych testów przy użyciujest --runInBand
(chociaż-i
ma to być alias) nie kończy się.Może to komuś pomoże
¯\_(:/)_/¯
źródło
Problem
await
przekroczenia limitu czasu występuje, gdy sieć jest wolna lub wykonywanych jest wiele połączeń sieciowych , scenariusze te przekraczają domyślny limit czasu, tj. 5000 ms. Aby uniknąć błędu limitu czasu, po prostu zwiększ limit czasu globali, które obsługują limit czasu. Lista globali i ich podpis można znaleźć tutaj .Dla Jest 24.9
źródło
Jeśli jest Jest <= 23:
Jeśli na Jest> 23:
źródło
Dla tych, którzy szukają wyjaśnienia
jest --runInBand
, możesz przejść do dokumentacji Uruchamianie lalkarza w środowiskach CI https://github.com/smooth-code/jest-puppeteerźródło
W przypadku, gdy ktoś nie naprawi problemu z powyższymi metodami, naprawiłem mój, otaczając funkcję asynchroniczną funkcją strzałki. Jak w:
źródło
W moim przypadku ten błąd zaczął pojawiać się losowo i nie znikał nawet po ustawieniu limitu czasu na 30000. Po prostu zakończenie procesu w terminalu i ponowne uruchomienie testów rozwiązało problem. Usunąłem również limit czasu i testy wciąż mija.
źródło
W Węźle ... to, co widzę, że ludzie zrobili jako przykład, jest poniżej
fakeEventEmitter
źródło