Ich lerne etwas über Abhängigkeitsinjektion und obwohl ich beim Schreiben von Funktionsbibliotheken den Reiz davon sehe, kann ich nicht erkennen, wie es irgendetwas löst, wenn Sie auch derjenige sind, der die Bibliotheken verwendet.
Dies vereinfacht das Testen der Bibliothek erheblich, da nicht viel getestet werden muss.
Sie müssen jedoch eventuell Ihre injizierte Funktion testen, wenn Sie die Bibliothek verwenden, und sich mit Verspottungs- und Stubbing-Funktionen aus der Standardbibliothek befassen.
Dies ist ein konkreter Fall, mit dem ich mich in Node.js befasse :
function compile(options) {
var files = options.files;
var texCompiler = options.texCompiler;
var pdfMerger = options.pdfMerger;
return Promise.all(files.map(texCompiler(files)))
.then(pdfMerger);
}
Das ist trivial zu testen: das Injizieren von Scheinobjekten oder Spionen als texCompiler
und pdfMerger
ist ein Kinderspiel, da die Funktion überhaupt nicht viel bewirkt. Ich kann nur testen, dass beide Funktionen in der richtigen Reihenfolge aufgerufen werden.
Es rettet mich jedoch nicht davor, meine texCompiler
und pdfMerger
Funktionen zu testen . Sie sehen ungefähr so aus:
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);
});
});
Dies ist die reale Sache, und es ist ein größerer Schmerz zu testen. Ich muss mich child_process.spawn
mit einem Spion lustig machen, um sicherzustellen, dass er mit den richtigen Argumenten aufgerufen wird, aber er macht eigentlich nichts, weil ich beim Ausführen der Tests keine PDF-Datei zusammenführen möchte und meine Mocks die ausgeben müssen richtige Ereignisse, damit die Funktion nicht hängen bleibt.
Dies sind Probleme, die ich gehabt hätte, wenn ich die Abhängigkeit nicht in mein erstes Snippet eingefügt und stattdessen diese Funktionen verwendet hätte. Und es fühlt sich wirklich so an, als würde ich das Problem weiter nach unten drücken, ohne es zu lösen.
Verstehe ich die Abhängigkeitsinjektion falsch? Mache ich es falsch