Saya mencoba menggunakan Jasmine untuk menulis beberapa spesifikasi BDD untuk permintaan AJAX jQuery dasar. Saat ini saya menggunakan Jasmine dalam mode mandiri (yaitu melalui SpecRunner.html
). Saya telah mengkonfigurasi SpecRunner untuk memuat jquery dan file .js lainnya. Ada ide mengapa hal berikut ini tidak berhasil? has_returned tidak menjadi kenyataan, bahkan mengira "yuppi!" peringatan muncul dengan baik.
describe("A jQuery ajax request should be able to fetch...", function() {
it("an XML file from the filesystem", function() {
$.ajax_get_xml_request = { has_returned : false };
// initiating the AJAX request
$.ajax({ type: "GET", url: "addressbook_files/addressbookxml.xml", dataType: "xml",
success: function(xml) { alert("yuppi!"); $.ajax_get_xml_request.has_returned = true; } });
// waiting for has_returned to become true (timeout: 3s)
waitsFor(function() { $.ajax_get_xml_request.has_returned; }, "the JQuery AJAX GET to return", 3000);
// TODO: other tests might check size of XML file, whether it is valid XML
expect($.ajax_get_xml_request.has_returned).toEqual(true);
});
});
Bagaimana cara menguji apakah callback telah dipanggil? Petunjuk apa pun ke blog / materi yang terkait dengan pengujian async jQuery dengan Jasmine akan sangat dihargai.
Lihat proyek melati-ajax: http://github.com/pivotal/jasmine-ajax .
Ini adalah drop-in helper yang (baik untuk jQuery atau Prototype.js) bertopik di lapisan XHR sehingga permintaan tidak pernah keluar. Anda kemudian dapat mengharapkan semua yang Anda inginkan tentang permintaan tersebut.
Kemudian ini memungkinkan Anda memberikan tanggapan tetap untuk semua kasus Anda dan kemudian menulis tes untuk setiap tanggapan yang Anda inginkan: sukses, gagal, tidak sah, dll.
Ini membuat panggilan Ajax keluar dari ranah pengujian asinkron dan memberi Anda banyak fleksibilitas untuk menguji cara kerja penangan respons Anda yang sebenarnya.
sumber
berikut adalah contoh rangkaian pengujian sederhana untuk aplikasi js seperti ini
contoh rangkaian pengujian, yang akan memanggil callback berdasarkan regexp url
sumber
.andCallFake
, gunakan.and.callFake
sebagai gantinya. Terima kasih.Ketika saya menentukan kode ajax dengan Jasmine, saya menyelesaikan masalah dengan memata-matai fungsi bergantung apa pun yang memulai panggilan jarak jauh (seperti, katakanlah, $ .get atau $ ajax). Kemudian saya mengambil callback yang disetel di atasnya dan mengujinya secara diam-diam.
Berikut adalah contoh yang saya dapatkan baru-baru ini:
https://gist.github.com/946704
sumber
Coba jqueryspy.com Ini menyediakan jquery elegan seperti sintaks untuk menggambarkan pengujian Anda dan memungkinkan panggilan balik untuk menguji setelah ajax selesai. Ini bagus untuk pengujian integrasi dan Anda dapat mengonfigurasi waktu tunggu ajax maksimum dalam hitungan detik atau milidetik.
sumber
Saya merasa perlu memberikan jawaban yang lebih up-to-date karena Jasmine sekarang ada di versi 2.4 dan beberapa fungsi telah berubah dari versi 2.0.
Jadi, untuk memverifikasi bahwa fungsi panggilan balik telah dipanggil dalam permintaan AJAX Anda, Anda perlu membuat mata-mata, menambahkan fungsi callFake ke sana kemudian menggunakan mata-mata sebagai fungsi panggilan balik Anda. Begini caranya:
Saya telah melakukan trik untuk fungsi sukses serta fungsi kesalahan untuk memastikan bahwa Jasmine akan menjalankan spesifikasi secepat mungkin bahkan jika AJAX Anda mengembalikan kesalahan.
Jika Anda tidak menentukan fungsi kesalahan dan AJAX mengembalikan kesalahan, Anda harus menunggu 5 detik (interval waktu tunggu default) sampai Jasmine membuat kesalahan
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Anda juga dapat menentukan waktu tunggu Anda sendiri seperti ini:sumber