Sto imparando sull'integrazione delle dipendenze e mentre riesco a vedere il fascino di questo quando scrivo le librerie funzionali, non riesco a vedere come risolve nulla quando sarai anche quello che usa le librerie.
Rende la verifica della libreria molto più semplice, perché non c'è molto da testare.
Ma alla fine dovrai testare la tua funzione iniettata quando usi la libreria e devi occuparti delle funzioni di mocking e stub dalla libreria standard.
Questo è un caso concreto di cui mi occupo in 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);
}
È banale da testare: iniettare oggetti mock o spiare come texCompiler
e pdfMerger
è un pezzo di torta perché la funzione in realtà non fa molto. Tutto quello che posso testare è che entrambe le funzioni sono chiamate nella giusta sequenza.
Tuttavia, non mi salva dal testare le mie funzioni texCompiler
e pdfMerger
. Sembrano qualcosa del genere:
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);
});
});
Questa è la cosa reale, ed è un dolore più grande da testare. Devo simulare child_process.spawn
con una spia per assicurarmi che venga chiamato con gli argomenti giusti, ma in realtà non fa nulla, perché non voglio in realtà unire alcun file PDF quando eseguo i test e le mie mamme hanno per emettere gli eventi giusti in modo che la funzione non sia bloccata.
Questi sono problemi che avrei avuto se non avessi iniettato la dipendenza nel mio primo snippet e usato invece queste funzioni. E mi sembra davvero di spingere il problema più in basso senza risolverlo.
Sto fraintendendo l'iniezione di dipendenza? Sto sbagliando?