Sinon: Dokumentasikan cara mengkonfigurasi Node untuk mengizinkan modul EcmaScript yang terhenti

Dibuat pada 8 Jun 2018  ·  17Komentar  ·  Sumber: sinonjs/sinon

Modul EcmaScript yang berjalan di lingkungan yang mendukungnya (artinya modul tersebut belum ditranspilasi menggunakan Babel ke ES5) dan mengekspor beberapa jenis fungsi default tidak dapat dihentikan, karena ruang nama ES tidak dapat diubah sesuai spesifikasi. Tidak ada yang dapat dilakukan Sinon tentang ini, jadi kami secara eksplisit memberikan kesalahan saat Anda mencoba melakukan ini: 'ES Modules cannot be stubbed' .

Tapi @jdalton telah menghasilkan esm , sebuah runtime loader untuk Node yang memungkinkan pemuatan modul EcmaScript ( *.mjs ), dan untuk memungkinkan stubbing menggunakan Sinon dan sejenisnya, dia telah menambahkan mutableNamespace opsi menjadi esm .

Harus ada artikel di bawah bagian Bagaimana kami yang menunjukkan bagaimana seseorang dapat mengatur npm untuk mengeksekusi node menggunakan esm dan opsi, bersama dengan skrip pengujian.

Referensi:

Documentation ES2015+ Help wanted good first issue hacktoberfest pinned

Komentar yang paling membantu

@giltayar Selamat atas penerapan dukungan ESM! Artikel bagus, btw. Kami selalu mengatakan bahwa penghentian ES Module tidak mungkin dilakukan dalam menyesuaikan ESM Runtimes, tetapi kami juga mengatakan (seperti di atas) bahwa ini harus ditangani pada tingkat penautan, menggunakan sesuatu seperti proxyquire, rewire, atau ... Quibble, yaitu di mana Anda menambahkan dukungan :)

Dalam proyek kerja saya, kami telah menggunakan proxyquire untuk menghentikan dependensi dari Modul ES:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

Ini akan sangat setara di Quibble (digunakan oleh TestDouble), di mana artikel memiliki contoh seperti ini, tetapi Quibble tidak mendukung potongan parsial, jadi sedikit berbeda dalam apa yang dilakukannya.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

Jadi sesuai dengan apa yang telah dikatakan sebelumnya, Sinon tidak akan pernah secara eksplisit menambahkan dukungan untuk mengejek Modul ES, karena itu lebih baik diserahkan ke Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (webpack) dan semua cara lain untuk melakukan ini yaitu lingkungan 100% tergantung.

Semua 17 komentar

Saya telah berpikir untuk menulis persis seperti ini :)

"Masalah" adalah bahwa ada banyak cara berbeda esm dapat digunakan, tetapi setidaknya kita harus membahas kasus yang paling umum, yang saya asumsikan adalah melalui tanda require ke node proses. Saya mulai menyempurnakan cara menggunakan file konfigurasi di sini , tetapi tampaknya juga memungkinkan untuk menyediakan string json sebagai variabel lingkungan juga (, selain opsi hash jika menggunakan kode).

Hai @ fatso83!

Opsi cjs.mutableNamespace diaktifkan secara bawaan sehingga tidak diperlukan konfigurasi. Stubbing akan bekerja dengan .js tetapi tidak dengan .mjs _ ( .mjs file dikunci, jadi tidak ada esm opsi) _.

@jdalton Terima kasih telah memberi tahu kami tentang perbedaan js vs mjs . Itu menjelaskan mengapa orang ini tidak bisa membuatnya berhasil.

cc @ jim-king-2000

Saya ingin menulis unit test dengan biaya minimum. Jika solusinya begitu rumit, saya lebih suka mengabaikan pengujian unit dengan tiruan. Bagaimanapun, uji tiruan bukanlah metode wajib untuk membangun sistem online yang kuat. Tapi, sebagai upaya terakhir, mungkinkah sinon membungkus "proxyrequire" (atau sesuatu seperti ini) untuk saya?

@ jim-king-2000 Itu di luar jangkauan. Anda telah memilih secara eksplisit untuk menggunakan sistem modul yang ekspornya seharusnya tidak dapat diubah. Sayangnya, itu adalah biaya yang harus Anda tanggung sendiri. Membungkus pemuat modul, membuatnya bekerja dalam semua jenis skenario (Node, browser, dengan / tanpa transpiler, dll) terlalu mahal dan tidak ada hubungannya dengan tujuan yang dinyatakan proyek ini .

Saya tidak begitu mengerti relevansi sinon dan sistem modul (maaf). Yang saya butuhkan adalah kerangka kerja pengujian unit js / node mock (atau pustaka, seperti java counterpart, mockito) tanpa babel. Jadi, apakah itu ada?

Singkatnya, untuk niche spesifik Anda: saat ini tidak: sob:
Secara umum: ya, ada cara untuk melakukannya untuk hampir semua kombinasi framework dan runtime.

Dalam istilah Java, ini seperti mengimplementasikan seluruh sistem Anda menggunakan metode Java static dan kemudian mencoba membuat tiruan kelas menggunakan Mockito. Itu tidak bisa dilakukan.

Karena itu, yang Anda butuhkan untuk membuat semuanya berfungsi adalah mengganti nama file *.mjs menjadi *.js . Ini tampak seperti jalan tengah yang pragmatis, karena Anda akan mendapatkan kemampuan untuk diuji tanpa kerugian yang diketahui.

Untuk mocking fungsi statis Java, kami menggunakan powermock. Tetapi saya mungkin tidak sepenuhnya memahami perbandingannya. Ngomong-ngomong, saya tidak suka java, evolusinya terlalu lambat. Sekarang masih TIDAK mendukung async / await.

Saya menggunakan * .mjs di mana-mana, semua kode sumber adalah file mjs. Lebih jauh lagi, itu berarti saya harus menggunakan babel lagi (memperkenalkan pekerjaan dev / run-time ekstra dan tumpukan panggilan yang berantakan). Tidak apa-apa jika saya hanya dapat mengubah file pengujian kembali ke * .js.

Saya akan meninggalkan ut dengan tiruan (tes lain masih utuh) sampai saya menemukan beberapa cara berbiaya rendah lainnya.

@ fatso83 Terima kasih atas bantuannya selama ini.

Apakah ada yang mencoba berdalih ? 🤔

FYI, saya mengimplementasikan dukungan Node.js ESM di "testdouble.js", yang merupakan pustaka tiruan. Itu _mungkin. Saya menulis tentang penerapannya di postingan blog ini:

https://dev.to/giltayar/mock-all-you-want-supporting-es-modules-in-the-testdouble-js-mocking-library-3gh1

Akan dengan senang hati membantu di sini jika ada yang ingin menerimanya ..

@giltayar Selamat atas penerapan dukungan ESM! Artikel bagus, btw. Kami selalu mengatakan bahwa penghentian ES Module tidak mungkin dilakukan dalam menyesuaikan ESM Runtimes, tetapi kami juga mengatakan (seperti di atas) bahwa ini harus ditangani pada tingkat penautan, menggunakan sesuatu seperti proxyquire, rewire, atau ... Quibble, yaitu di mana Anda menambahkan dukungan :)

Dalam proyek kerja saya, kami telah menggunakan proxyquire untuk menghentikan dependensi dari Modul ES:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

Ini akan sangat setara di Quibble (digunakan oleh TestDouble), di mana artikel memiliki contoh seperti ini, tetapi Quibble tidak mendukung potongan parsial, jadi sedikit berbeda dalam apa yang dilakukannya.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

Jadi sesuai dengan apa yang telah dikatakan sebelumnya, Sinon tidak akan pernah secara eksplisit menambahkan dukungan untuk mengejek Modul ES, karena itu lebih baik diserahkan ke Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (webpack) dan semua cara lain untuk melakukan ini yaitu lingkungan 100% tergantung.

@ fatso83 Jika saya boleh bertanya mengapa ini begitu yakin "tidak pernah secara eksplisit menambahkan dukungan"? Saya membacanya beberapa kali di sini pada hari-hari terakhir ketika mati-matian mencari solusi untuk mengejek kode modul ES6 saya.

Tidak ada solusi yang didokumentasikan di Jest, tidak ada yang ada di sini. Saya hampir menyerah sampai menemukan artikel @giltayar. Lega sekali. Saya mendapatkan sesuatu yang bekerja dengan quibble sampai saya menyadari bahwa saya bisa menggunakan testdouble.js.

Sudah cukup sulit bahwa di JavaScript setiap paket memiliki gaya dokumentasinya sendiri dan sebagian besar waktu tidak ada dokumen API yang sebenarnya, tetapi juga harus mencari tahu cara kerja pustaka pengujian, pustaka yang mengejek bekerja, dan pemuat modul untuk pustaka yang mengejek bekerja terlalu berlebihan. .

Saya sangat setuju jika Anda mengatakan bahwa Anda fokus pada Sinon apa adanya sementara yang lain dapat fokus pada kabel paket tersebut bersama-sama untuk programmer "pengguna akhir". Saya hanya ingin menunjukkan, bahwa ada rasa sakit yang nyata bagi programmer seperti saya dan saya yakin banyak yang akan senang jika prosesnya disederhanakan, terutama jika banyak yang akan pindah ke modul ES di tahun-tahun mendatang.

Saya tidak memiliki pemahaman teknis yang mendalam, saya hanya berpikir beberapa umpan balik dari pengalaman saya dapat membantu

@ fatso83 Jika saya boleh bertanya mengapa ini begitu yakin "tidak pernah secara eksplisit menambahkan dukungan"?

Izinkan saya mengulang: menurut pendapat pengelola Sinon, berurusan dengan impor tiruan berada di luar cakupan Sinon dan lebih baik ditangani oleh perpustakaan khusus.

Secara umum, tidak masuk akal untuk membuat pustaka yang mencoba melakukan segalanya, di setiap waktu proses. Proyek open source yang bahkan tidak lebih besar dan didanai dengan baik mencoba melakukan ini.

Tidak ada solusi yang didokumentasikan di Jest, tidak ada yang ada di sini. Saya hampir menyerah sampai menemukan artikel @giltayar. Lega sekali. Saya mendapatkan sesuatu yang bekerja dengan quibble sampai saya menyadari bahwa saya bisa menggunakan testdouble.js.

Perpustakaan yang berbeda membuat pilihan yang berbeda.

Pengelola testdouble.js membuat pilihan mereka sendiri. Mereka memutuskan untuk menerbitkan quibble dan mengintegrasikannya ke dalam perpustakaan mereka. Baik untuk mereka. Jika Anda menyukai solusinya, gunakan saja. Kami tidak memiliki apa-apa selain cinta dan rasa hormat untuk @searls dan pengelola testdouble.js.

Sudah cukup sulit bahwa di JavaScript setiap paket memiliki gaya dokumentasinya sendiri dan sebagian besar waktu tidak ada dokumen API yang sebenarnya, tetapi juga harus mencari tahu cara kerja pustaka pengujian, pustaka yang mengejek bekerja, dan pemuat modul untuk pustaka yang mengejek bekerja terlalu berlebihan. .

Saya sangat setuju jika Anda mengatakan bahwa Anda fokus pada Sinon apa adanya sementara yang lain dapat fokus pada kabel paket tersebut bersama-sama untuk programmer "pengguna akhir". Saya hanya ingin menunjukkan, bahwa ada rasa sakit yang nyata bagi programmer seperti saya dan saya yakin banyak yang akan senang jika prosesnya disederhanakan, terutama jika banyak yang akan pindah ke modul ES di tahun-tahun mendatang.

Kami di sini bukan untuk menyelesaikan setiap masalah dalam ekosistem JavaScript.

Selama lebih dari satu dekade, berbagai pengelola telah menyediakan perpustakaan keluarga Sinon secara gratis. Praktis semua pekerjaan yang telah dilakukan untuk memelihara perpustakaan ini telah dilakukan sebagai pekerjaan tidak berbayar, di waktu luang para pengelola. Kami sendiri menggunakan JavaScript secara profesional dan membagikan rasa frustrasi Anda. Tapi, kita hanya punya banyak waktu untuk dibagikan secara gratis.

Saya tidak memiliki pemahaman teknis yang mendalam, saya hanya berpikir beberapa umpan balik dari pengalaman saya dapat membantu

Apa yang akan membantu jika Anda menulis posting blog tentang frustrasi Anda mengejek ketergantungan, sampai Anda menemukan solusi yang bekerja dengan baik untuk Anda, dan bagaimana Anda telah menggunakan testdouble.js untuk sukses besar dengan cara Anda memuat JavaScript.

Jika ternyata menjadi posting blog yang solid, saya akan dengan senang hati mempromosikannya di sinonjs.org .

@mroderick Saya rasa saya harus menjelaskan terlebih dahulu bahwa Anda dan pengelola Sinon sangat saya hormati!

Kami di sini bukan untuk menyelesaikan setiap masalah dalam ekosistem JavaScript.

Jelas tidak, itu hanya dimaksudkan untuk menunjukkan bahwa mungkin ada kebutuhan bantuan yang lebih besar daripada dengan bahasa lain (hanya tebakan saya).

berurusan dengan impor tiruan berada di luar ruang lingkup Sinon dan lebih baik ditangani oleh perpustakaan khusus.

Cukup adil, seperti yang saya katakan, saya dapat memahami itu dan mungkin Anda memiliki pemahaman yang lebih mendalam tentang upaya yang dilakukan dengan mengimplementasikan fitur tersebut. Juga, API pemuat masih eksperimental.

Saat ini saya sedang mengerjakan alat CLI kecil yang saya rencanakan untuk dirilis sebagai sumber terbuka segera setelah ada versi yang berfungsi. Jika itu dilakukan saya mempertimbangkan untuk menulis posting blog tentang itu. Saya masih akan mencoba Sinon dengan proxyquire sebelumnya, karena saya membaca terlalu banyak hal baik tentang Sinon.

Saya masih akan mencoba Sinon dengan proxyquire sebelumnya, karena saya membaca terlalu banyak hal baik tentang Sinon.

Kami memiliki panduan tentang cara melakukannya: https://sinonjs.org/how-to/link-seams-commonjs/

Jika Anda menemukan bahwa panduan ini dapat ditingkatkan, silakan kirim permintaan tarik 👍

Apakah halaman ini membantu?
0 / 5 - 0 peringkat