Saya memiliki layanan sudut bernama requestNotificationChannel
:
app.factory("requestNotificationChannel", function($rootScope) {
var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";
function deleteMessage(id, index) {
$rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
};
return {
deleteMessage: deleteMessage
};
});
Saya mencoba untuk menguji layanan ini menggunakan melati:
"use strict";
describe("Request Notification Channel", function() {
var requestNotificationChannel, rootScope, scope;
beforeEach(function(_requestNotificationChannel_) {
module("messageAppModule");
inject(function($injector, _requestNotificationChannel_) {
rootScope = $injector.get("$rootScope");
scope = rootScope.$new();
requestNotificationChannel = _requestNotificationChannel_;
})
spyOn(rootScope, '$broadcast');
});
it("should broadcast delete message notification", function(done) {
requestNotificationChannel.deleteMessage(1, 4);
expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
done();
});
});
Saya membaca tentang Dukungan Asinkron di Jasmine, tetapi karena saya agak baru dalam pengujian unit dengan javascript tidak dapat membuatnya berfungsi.
Saya menerima kesalahan:
Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
dan pengujian saya terlalu lama untuk dijalankan (sekitar 5s).
Adakah yang bisa membantu saya memberikan contoh kerja kode saya dengan beberapa penjelasan?
Jest
diharapkan - sangat umum saat debugging dan meluangkan waktu untuk memeriksa variabel.afterEach
langkah yang membersihkan database (menggunakandeleteMany
metode). Menambahkanjest.setTimeout(30000);
dalambeforeAll
metode ini tampaknya telah memperbaiki ini untuk saya - saya menduga karena penghapusan basis data adalah panggilan jaringan (di dalam kondisi), kadang-kadang membutuhkan waktu lebih dari 3 detik dan melempar.Jawaban:
Memiliki argumen dalam
it
fungsi Anda (done
dalam kode di bawah) akan menyebabkan Jasmine mencoba melakukan panggilan async.Tidak ada bedanya apa nama
done
argumen itu, keberadaannya adalah yang terpenting. Saya mengalami masalah ini karena terlalu banyak salin / pasta.Dokumen Dukungan Jasmine Asynchronous mencatat bahwa argumen (disebutkan di
done
atas) adalah panggilan balik yang dapat dipanggil untuk memberi tahu Jasmine ketika fungsi asinkron selesai. Jika Anda tidak pernah menyebutnya, Jasmine tidak akan pernah tahu tes Anda selesai dan pada akhirnya akan habis.sumber
Bahkan untuk tes async, ada batas waktu yang padam dalam kasus ini, Anda bisa mengatasi kesalahan ini dengan meningkatkan nilai batas waktu batas untuk mengevaluasi panggilan balik Jasmine async
Sumber: http://jasmine.github.io/2.0/introduction.html#section-42
sumber
Kesalahan ini juga dapat disebabkan oleh tidak menyuntikkan saat menginisialisasi layanan / pabrik atau apa pun. Sebagai contoh, itu dapat dibuang dengan melakukan ini:
Untuk memperbaikinya cukup bungkus fungsi dengan menyuntikkan untuk mengambil layanan dengan benar:
sumber
gunakan fakeAsync
sumber
Anda dapat menggunakan plugin karma-jasmine untuk mengatur interval waktu default secara global.
Tambahkan konfigurasi ini di karma.conf.js
sumber
Kesalahan ini berawal dari saya, pada tes yang selalu berhasil. Saya tidak dapat menemukan saran yang membantu sampai saya perhatikan Macbook saya berjalan lamban. Saya perhatikan CPU dipatok oleh proses lain, yang saya bunuh. Kesalahan Jasmine async menghilang dan tes saya baik-baik saja sekali lagi.
Jangan tanya kenapa, saya tidak tahu. Tetapi dalam keadaan saya tampaknya kekurangan sumber daya sistem kesalahan.
sumber
Ini lebih merupakan pengamatan daripada jawaban, tetapi mungkin membantu orang lain yang sama frustrasinya dengan saya.
Saya terus mendapatkan kesalahan ini dari dua tes di suite saya. Saya pikir saya baru saja memecahkan tes dengan refactoring yang saya lakukan, jadi setelah mencadangkan perubahan tidak berhasil, saya kembali ke kode sebelumnya, dua kali (dua revisi kembali) berpikir itu akan menghilangkan kesalahan. Melakukan hal itu tidak mengubah apa pun. Saya mengejar ekor saya sepanjang hari kemarin, dan sebagian pagi ini tanpa menyelesaikan masalah.
Saya merasa frustrasi dan memeriksa kode ke laptop pagi ini. Jalankan seluruh test suite (sekitar 180 tes), tidak ada kesalahan. Jadi kesalahan tidak pernah ada dalam kode atau tes. Kembali ke kotak dev saya dan mem-boot ulang untuk menghapus semua yang ada di memori yang mungkin menyebabkan masalah. Tidak ada perubahan, kesalahan yang sama pada dua tes yang sama. Jadi saya menghapus direktori dari mesin saya, dan memeriksanya kembali. Voila! Tidak ada kesalahan
Tidak tahu apa yang menyebabkannya, atau bagaimana cara memperbaikinya, tetapi menghapus direktori kerja dan memeriksanya tetap apa pun itu.
Semoga ini bisa membantu seseorang.
sumber
Jangan gunakan
done
, biarkan saja fungsi panggilan kosong.sumber
Anda juga mendapatkan kesalahan ini saat mengharapkan sesuatu di
beforeAll
fungsi!sumber
Dalam kasus saya, kesalahan ini disebabkan oleh penggunaan yang tidak benar dari "fixture.detectChanges ()" Tampaknya metode ini adalah pendengar acara (async) yang hanya akan merespons panggilan balik ketika perubahan terdeteksi. Jika tidak ada perubahan yang terdeteksi, itu tidak akan memanggil balik, menghasilkan kesalahan waktu habis. Semoga ini membantu :)
sumber
Bekerja setelah menghapus
scope
referensi dan argumen fungsi:sumber
sumber
jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
Menjaga ini di blok memecahkan masalah saya.
sumber
Apa yang saya lakukan adalah: Menambahkan / Memperbarui kode berikut:
sumber
Dari pada
menggunakan
sumber
Sepertinya tes sedang menunggu panggilan balik yang tidak pernah datang. Kemungkinan karena tes tidak dijalankan dengan perilaku asinkron.
Pertama, lihat apakah hanya menggunakan fakeAsync dalam skenario "it" Anda:
Anda juga dapat menggunakan
flush()
untuk menunggu antrian microTask selesai atautick()
menunggu sejumlah waktu tertentu.sumber
Jika Anda memiliki argumen (
done
) dalamit
fungsi, cobalah untuk menghapusnya dan itu juga panggilan dalam fungsi itu sendiri:sumber