Saya mencoba mencari cara untuk menguji fungsi internal (yaitu tidak diekspor) di nodejs (lebih disukai dengan moka atau melati). Dan saya tidak tahu!
Katakanlah saya punya modul seperti itu:
function exported(i) {
return notExported(i) + 1;
}
function notExported(i) {
return i*2;
}
exports.exported = exported;
Dan tes berikut (moka):
var assert = require('assert'),
test = require('../modules/core/test');
describe('test', function(){
describe('#exported(i)', function(){
it('should return (i*2)+1 for any given i', function(){
assert.equal(3, test.exported(1));
assert.equal(5, test.exported(2));
});
});
});
Apakah ada cara untuk menguji unit notExported
fungsi tanpa benar-benar mengekspornya karena itu tidak dimaksudkan untuk diekspos?
node.js
unit-testing
jasmine
mocha
xavier.seignard
sumber
sumber
Jawaban:
The rewire Modul pasti jawabannya.
Ini kode saya untuk mengakses fungsi yang tidak diekspor dan mengujinya menggunakan Mocha.
application.js:
test.js:
sumber
Cannot find module '../../package' from 'node.js'
. Pernahkah kamu melihat ini?Caranya adalah dengan mengatur
NODE_ENV
variabel lingkungan ke sesuatu sepertitest
dan kemudian mengekspornya secara kondisional.Dengan asumsi Anda belum menginstal moka secara global, Anda dapat memiliki Makefile di root direktori aplikasi Anda yang berisi yang berikut ini:
Ini membuat file mengatur NODE_ENV sebelum menjalankan moka. Anda kemudian dapat menjalankan tes moka dengan
make test
di baris perintah.Sekarang, Anda dapat mengekspor secara kondisional fungsi Anda yang biasanya tidak diekspor hanya ketika tes mocha Anda berjalan:
Jawaban lain menyarankan menggunakan modul vm untuk mengevaluasi file, tetapi ini tidak berhasil dan menimbulkan kesalahan yang menyatakan bahwa ekspor tidak didefinisikan.
sumber
EDIT:
Memuat modul menggunakan
vm
dapat menyebabkan perilaku yang tidak terduga (misalnyainstanceof
operator tidak lagi bekerja dengan objek yang dibuat dalam modul seperti itu karena prototipe global berbeda dari yang digunakan dalam modul yang dimuat secara normal denganrequire
). Saya tidak lagi menggunakan teknik di bawah ini dan sebagai gantinya menggunakan modul rewire . Ini bekerja dengan sangat baik. Inilah jawaban asli saya:Menguraikan jawaban srosh ...
Rasanya agak gila, tapi saya menulis modul "test_utils.js" sederhana yang akan memungkinkan Anda melakukan apa yang Anda inginkan tanpa memiliki ekspor bersyarat dalam modul aplikasi Anda:
Ada beberapa hal lagi yang termasuk dalam
module
objek gobal modul simpul yang mungkin juga perlu masuk kecontext
objek di atas, tetapi ini adalah set minimum yang saya butuhkan agar bisa berfungsi.Berikut ini contoh menggunakan mocha BDD:
sumber
rewire
?Bekerja dengan Jasmine, saya mencoba masuk lebih dalam dengan solusi yang diusulkan oleh Anthony Mayfield , berdasarkan rewire .
Saya menerapkan fungsi berikut ( Perhatian : belum diuji secara menyeluruh, hanya dibagikan sebagai strategi yang memungkinkan) :
Dengan fungsi seperti ini, Anda dapat memata-matai kedua metode objek yang tidak diekspor dan fungsi tingkat atas yang tidak diekspor, sebagai berikut:
Kemudian Anda dapat menetapkan harapan seperti ini:
sumber
Anda dapat membuat konteks baru menggunakan modul vm dan mengevaluasi file js di dalamnya, semacam seperti repl. maka Anda memiliki akses ke semua yang dinyatakannya.
sumber
Saya telah menemukan cara yang cukup sederhana yang memungkinkan Anda untuk menguji, memata-matai dan mengejek fungsi-fungsi internal dari dalam tes:
Katakanlah kita memiliki modul simpul seperti ini:
Jika sekarang kita ingin menguji dan memata - matai dan mengejek
myInternalFn
tanpa mengekspornya dalam produksi, kita harus memperbaiki file seperti ini:Sekarang Anda dapat menguji, memata-matai dan mengejek di
myInternalFn
mana - mana di mana Anda menggunakannyatestable.myInternalFn
dan dalam produksi tidak diekspor .sumber
Ini bukan praktik yang disarankan, tetapi jika Anda tidak dapat menggunakan
rewire
seperti yang disarankan oleh @Antoine, Anda selalu dapat hanya membaca file dan menggunakaneval()
.Saya menemukan ini berguna saat unit menguji file JS sisi klien untuk sistem lawas.
File JS akan mengatur banyak variabel global
window
tanpa adarequire(...)
danmodule.exports
pernyataan (tidak ada bundler modul seperti Webpack atau Browserify yang tersedia untuk menghapus pernyataan ini pula).Daripada memperbaiki seluruh basis kode, ini memungkinkan kami untuk mengintegrasikan tes unit di JS sisi klien kami.
sumber