Estou aprendendo sobre injeção de dependência e, embora eu possa ver o apelo disso ao escrever bibliotecas funcionais, não vejo como isso resolve alguma coisa quando você também é quem usa as bibliotecas.
Isso torna o teste da biblioteca muito mais simples, porque não há muito o que testar.
Mas, eventualmente, você terá que testar sua função injetada ao usar a biblioteca e lidar com as funções de zombaria e stub da biblioteca padrão.
Este é um caso concreto com o qual estou lidando no 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);
}
Isso é trivial para testar: injetar objetos simulados ou espiões como o texCompiler
e pdfMerger
é um pedaço de bolo, porque a função realmente não faz muito. Tudo o que posso testar é que ambas as funções são chamadas na sequência correta.
No entanto, isso não me impede de testar minhas funções texCompiler
e pdfMerger
. Eles se parecem com isso:
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);
});
});
Essa é a coisa real e é mais difícil testar. Preciso zombar de child_process.spawn
um espião para garantir que ele seja chamado com os argumentos corretos, mas na verdade não faz nada, porque não quero mesclar nenhum arquivo PDF ao executar os testes e minhas zombarias precisam emitir o eventos corretos para que a função não fique presa.
Esses são os problemas que eu teria se não injetasse a dependência no meu primeiro trecho e usasse essas funções. E realmente parece que estou empurrando o problema mais para baixo sem resolvê-lo.
Estou entendendo mal a injeção de dependência? Estou fazendo errado?