Saya memiliki modul AMD yang ingin saya uji, tetapi saya ingin mengejek dependensinya alih-alih memuat dependensi yang sebenarnya. Saya menggunakan requirejs, dan kode untuk modul saya terlihat seperti ini:
define(['hurp', 'durp'], function(Hurp, Durp) {
return {
foo: function () {
console.log(Hurp.beans)
},
bar: function () {
console.log(Durp.beans)
}
}
}
Bagaimana saya bisa mengejek hurp
dan durp
jadi saya bisa secara efektif menguji unit?
javascript
unit-testing
mocking
requirejs
jergason
sumber
sumber
define
fungsi. Ada beberapa opsi berbeda. Saya akan mengirim jawaban dengan harapan itu akan membantu.Jawaban:
Jadi setelah membaca posting ini saya datang dengan solusi yang menggunakan fungsi config requirejs untuk membuat konteks baru untuk pengujian Anda di mana Anda dapat dengan mudah mengejek dependensi Anda:
Jadi itu menciptakan konteks baru di mana definisi untuk
Hurp
danDurp
akan ditetapkan oleh objek yang Anda berikan ke fungsi. Math.random untuk namanya mungkin agak kotor tapi berhasil. Karena jika Anda akan memiliki banyak tes, Anda perlu membuat konteks baru untuk setiap suite untuk mencegah penggunaan kembali ejekan Anda, atau untuk memuat ejekan saat Anda menginginkan modul yang diperlukan.Dalam kasus Anda akan terlihat seperti ini:
Jadi saya menggunakan pendekatan ini dalam produksi untuk sementara waktu dan sangat kuat.
sumber
createContext
fungsi. Jadi dalam kasus Anda jika Anda hanya{hurp: 'hurp'}
berfungsi,durp
file akan dimuat sebagai ketergantungan normal.Anda mungkin ingin memeriksa lib Squire.js baru
dari dokumen:
Squire.js adalah injektor dependensi bagi pengguna Require.js untuk membuat dependensi mengejek mudah!
sumber
Saya telah menemukan tiga solusi berbeda untuk masalah ini, tidak ada yang menyenangkan.
Mendefinisikan Dependensi Inline
Jelek Anda harus mengacaukan tes Anda dengan banyak boilerplate AMD.
Memuat Ketergantungan Mock Dari Berbagai Jalur
Ini melibatkan menggunakan file config.js terpisah untuk menentukan jalur untuk setiap dependensi yang menunjuk ke mengejek alih-alih dependensi asli. Ini juga jelek, membutuhkan penciptaan banyak file uji dan file konfigurasi.
Fake It In Node
Ini adalah solusi saya saat ini, tetapi masih merupakan solusi yang mengerikan.
Anda membuat
define
fungsi Anda sendiri untuk memberikan tiruan Anda sendiri ke modul dan menempatkan tes Anda dalam panggilan balik. Maka Andaeval
modul untuk menjalankan tes Anda, seperti:Ini adalah solusi pilihan saya. Itu terlihat sedikit ajaib, tetapi memiliki beberapa manfaat.
eval
kemarahan, dan bayangkan Crockford meledak dengan amarah.Itu masih memiliki beberapa kelemahan, jelas.
define
dalam setiap tes, karena di situlah tes Anda benar-benar berjalan.Saya sedang mengerjakan test runner untuk memberikan sintaksis yang lebih bagus untuk hal-hal semacam ini, tetapi saya masih belum memiliki solusi yang baik untuk masalah 1.
Kesimpulan
Mengejek deps dalam Requirejs menyebalkan. Saya menemukan cara semacam itu berfungsi, tetapi saya masih tidak begitu senang dengannya. Tolong beri tahu saya jika Anda memiliki ide yang lebih baik.
sumber
Ada
config.map
opsi http://requirejs.org/docs/api.html#config-map .Tentang cara menggunakannya:
Konfigurasikan PersyaratanJS secara tak terduga;
Dalam hal ini untuk kode tes normal dan Anda dapat menggunakan
foo
modul yang akan menjadi referensi modul nyata dan rintisan sesuai.sumber
Anda dapat menggunakan testr.js untuk mengejek dependensi. Anda dapat mengatur testr untuk memuat dependensi tiruan alih-alih yang asli. Berikut adalah contoh penggunaannya:
Lihat ini juga: http://cyberasylum.janithw.com/mocking-requirejs-dependencies-for-unit-testing/
sumber
Jawaban ini didasarkan pada jawaban Andreas Köberle .
Itu tidak mudah bagi saya untuk menerapkan dan memahami solusinya, jadi saya akan menjelaskannya dengan sedikit lebih detail bagaimana cara kerjanya, dan beberapa jebakan yang harus dihindari, berharap itu akan membantu pengunjung masa depan.
Jadi, pertama-tama pengaturan:
Saya menggunakan Karma sebagai pelari uji dan MochaJs sebagai kerangka uji.
Menggunakan sesuatu seperti Squire tidak berhasil untuk saya, untuk beberapa alasan, ketika saya menggunakannya, kerangka uji melemparkan kesalahan:
RequireJs memiliki kemungkinan untuk memetakan id modul ke id modul lainnya. Ini juga memungkinkan untuk membuat
require
fungsi yang menggunakan konfigurasi berbeda dari globalrequire
.Fitur-fitur ini sangat penting untuk solusi ini untuk bekerja.
Ini adalah versi saya dari kode mock, termasuk (banyak) komentar (saya harap ini dapat dimengerti). Saya membungkusnya di dalam modul, sehingga tes dapat dengan mudah membutuhkannya.
Perangkap terbesar yang saya temui, yang benar-benar menghabiskan waktu berjam-jam, adalah menciptakan konfigurasi RequireJs. Saya mencoba (mendalam) menyalinnya, dan hanya menimpa properti yang diperlukan (seperti konteks atau peta). Ini tidak bekerja! Hanya salin
baseUrl
, ini berfungsi dengan baik.Pemakaian
Untuk menggunakannya, minta itu dalam pengujian Anda, buat tiruannya, dan kemudian berikan
createMockRequire
. Sebagai contoh:Dan di sini contoh file uji lengkap :
sumber
jika Anda ingin membuat beberapa tes js sederhana yang mengisolasi satu unit, maka Anda cukup menggunakan cuplikan ini:
sumber