Saya belajar tentang ketergantungan injeksi dan sementara saya bisa melihat daya tariknya ketika menulis pustaka fungsional, saya gagal melihat bagaimana hal itu memecahkan apa pun ketika Anda juga akan menjadi orang yang menggunakan pustaka.
Itu membuat pengujian perpustakaan lebih sederhana, karena tidak banyak yang bisa diuji.
Tetapi pada akhirnya Anda harus menguji fungsi yang disuntikkan ketika Anda menggunakan perpustakaan dan harus berurusan dengan fungsi mengejek dan mematikan dari perpustakaan standar.
Ini adalah kasus nyata yang saya hadapi di Node.js :
function compile(options) {
var files = options.files;
var texCompiler = options.texCompiler;
var pdfMerger = options.pdfMerger;
return Promise.all(files.map(texCompiler(files)))
.then(pdfMerger);
}
Itu sepele untuk menguji: menyuntikkan benda-benda tiruan atau mata-mata sebagai texCompiler
dan pdfMerger
sepotong kue karena fungsinya benar-benar tidak berbuat banyak sama sekali. Yang bisa saya uji adalah bahwa kedua fungsi dipanggil dalam urutan yang benar.
Itu tidak menyelamatkan saya dari pengujian texCompiler
dan pdfMerger
fungsi saya pada akhirnya. Mereka terlihat seperti itu:
var tex2Pdf = Promise.method(function tex2Pdf(tex_doc) {
var latex_command = 'pdflatex';
var pdf_output_filename = path.parse(tex_doc).name + '.pdf';
var cmd = latex_command + ' ' + tex_doc;
var options = {
cwd: path.resolve(tex_doc, '..') // pdflatex will only look for custom
// cls files in the cwd and includes relative to the cwd
};
child_process.spawn(cmd, options)
.on('end', function() {
console.log('tex2Pdf finish');
debugger;
return path.resolve(tex_doc, '..', pdf_output_filename);
})
.on('error', function(e) {
throw e;
});
});
var mergeTwoPdf = Promise.method(function mergeTwoPdf(pdf_files) {
var output_file = randomId() + '.pdf';
var cmd = 'gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=' + output_file + ' ' + pdf_files[0] + ' ' + pdf_file[1];
child_process.spawn(cmd)
.on('finish', function() {
return output_file;
})
.on('error', function(e) {
throw (e);
});
});
Ini adalah hal yang nyata, dan itu adalah rasa sakit yang lebih besar untuk diuji. Saya harus mengejek child_process.spawn
dengan mata-mata untuk memastikan itu dipanggil dengan argumen yang benar, tetapi itu tidak benar-benar melakukan apa-apa, karena saya tidak ingin benar-benar menggabungkan file PDF ketika menjalankan tes dan tiruan saya harus memancarkan Peristiwa yang tepat sehingga fungsi tidak macet.
Ini adalah masalah yang akan saya miliki jika saya tidak menyuntikkan dependensi dalam cuplikan pertama saya dan menggunakan fungsi-fungsi ini sebagai gantinya. Dan itu benar-benar terasa seperti saya mendorong masalah lebih jauh tanpa menyelesaikannya.
Apakah saya salah paham injeksi ketergantungan? Apakah saya salah?