Saya menggunakan dalang dan bercanda untuk menjalankan beberapa tes ujung depan.
Tes saya terlihat sebagai berikut:
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);
});
Terkadang, ketika saya menjalankan tes, semuanya berjalan seperti yang diharapkan. Di waktu lain, saya mendapatkan kesalahan:
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)
Ini aneh karena:
Saya menetapkan batas waktu menjadi 30000
Apakah saya mendapatkan kesalahan ini atau tidak tampaknya sangat acak
Adakah yang bisa menebak mengapa ini terjadi?
Jawaban:
Jadi batas waktu yang Anda tentukan di sini harus lebih pendek dari batas waktu default.
Batas waktu default adalah
5000
dan kerangka kerja secara default adalahjasmine
dalam kasusjest
. Anda dapat menentukan batas waktu di dalam tes dengan menambahkanTapi ini khusus untuk tes. Atau Anda dapat mengatur file konfigurasi untuk framework.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Lihat utas ini juga
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
Kesalahan ejaan PS
setupFilesAfterEnv
(yaitusetupFileAfterEnv
) juga akan menimbulkan kesalahan yang sama.sumber
setupTestFrameworkScriptFile
telah diganti dengansetupFilesAfterEnv
, sehingga menjadisetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
dapat ditambahkan ke satu tes untuk kasus tepi sehingga seluruh konfigurasi tidak perlu berubah :)jest.setTimeout(30000);
dijest.config.js
saya mendapatkan "ReferenceError: bercanda tidak didefinisikan". Saya mencoba menambahkanconst jest = require("jest");
tetapi kemudian saya mendapatkan "TypeError: jest.setTimeout bukan fungsi".setupFilesAfterEnv
argumen dijest.config.js
akan menunjuk ke file lain di mana kami meletakkanjest.setTimeout(30000)
opsi. Sangat menyenangkan bahwa kita dapat mengkonfigurasi ini tetapi menurut saya agak rumit.Itu harus memanggil
async/await
kapan async dari tes.sumber
done
fungsi async? Bukankah kita hanya mengembalikan Janji atau tidak ditentukan?page.click
. selesai () digunakan, setidaknya dalam kasus saya, terutama untuk pengujian dengan callback.done
panggilan balik yang tidak diperlukan.done
dalam kasus ini) dalam panggilan balik menyebabkan Jest menunggu hingga parameter ini dipanggil. Kehadirannya signifikan bahkan jika itu tidak digunakan.Jawaban atas pertanyaan ini telah berubah karena Jest telah berevolusi. Jawaban saat ini (Maret 2019):
Anda dapat mengesampingkan batas waktu setiap tes individual dengan menambahkan parameter ketiga ke
it
. yaitu.it('runs slow', () => {...}, 9999)
Anda dapat mengubah menggunakan standar
jest.setTimeout
. Untuk melakukan ini:dan
done
tidak perlu dengan pendekatan asink / menunggu.sumber
Saya ingin menambahkan (ini agak lama untuk komentar) yang bahkan dengan batas waktu
3000
tes saya masih kadang-kadang (secara acak) gagal denganBerkat jawaban luar biasa @ Tarun, saya pikir cara terpendek untuk memperbaiki banyak tes adalah:
sumber
jest.setTimeout()
dalambeforeEach
, menyebutnya sekali sudah cukup untuk semua tes.Ini adalah pembaruan yang relatif baru tetapi jauh lebih lurus ke depan. Jika Anda menggunakan lelucon 24.9.0 atau lebih tinggi Anda bisa menambahkan
testTimeout
ke konfigurasi Anda:sumber
Pastikan untuk melakukan
done();
panggilan balik atau tidak akan lulus ujian.Berlaku untuk semua fungsi lain yang memiliki callback selesai ().
sumber
Untuk lelucon 24.9+, Anda juga dapat mengatur batas waktu dari baris perintah dengan menambahkan
--testTimeout
Berikut kutipan dari dokumennya
sumber
Saya baru-baru ini mengalami masalah ini karena alasan yang berbeda: Saya menjalankan beberapa tes secara serentak menggunakan
jest -i
, dan itu hanya akan kehabisan waktu. Untuk alasan apa pun, menjalankan tes yang sama menggunakanjest --runInBand
(meskipun-i
dimaksudkan untuk menjadi alias) tidak kehabisan waktu.Mungkin ini akan membantu seseorang
¯\_(:/)_/¯
sumber
Masalah batas waktu terjadi ketika salah satu jaringan lambat atau banyak panggilan jaringan dibuat menggunakan
await
, skenario ini melebihi batas waktu default yaitu 5000 ms. Untuk menghindari kesalahan batas waktu, cukup tambahkan batas waktu global yang mendukung batas waktu. Daftar global dan tanda tangannya dapat ditemukan di sini .Untuk Jest 24.9
sumber
Jika di Jest <= 23:
Jika bercanda> 23:
sumber
Bagi mereka yang mencari penjelasan tentang
jest --runInBand
Anda dapat pergi ke dokumentasi Menjalankan boneka di lingkungan CI https://github.com/smooth-code/jest-puppeteersumber
Jika seseorang tidak memperbaiki masalah menggunakan metode di atas, saya memperbaiki tambang dengan mengelilingi fungsi async dengan fungsi panah. Seperti dalam:
sumber
Dalam kasus saya, kesalahan ini mulai muncul secara acak dan tidak akan hilang bahkan setelah menetapkan batas waktu 30000. Cukup mengakhiri proses di terminal dan menjalankan kembali tes menyelesaikan masalah untuk saya. Saya juga telah menghapus batas waktu dan tes masih berlalu lagi.
sumber
Di Node ... apa yang saya lihat dilakukan orang sebagai contoh di bawah ini, menggunakan
fakeEventEmitter
sumber