Tôi đang tìm hiểu về tiêm phụ thuộc và trong khi tôi có thể thấy sự hấp dẫn của nó khi viết thư viện chức năng, tôi không thấy cách nó giải quyết bất cứ điều gì khi bạn cũng sẽ là người sử dụng các thư viện.
Nó làm cho việc kiểm tra thư viện đơn giản hơn nhiều, vì không có nhiều thứ để kiểm tra.
Nhưng cuối cùng bạn sẽ phải kiểm tra chức năng được tiêm của mình khi bạn sử dụng thư viện và phải đối phó với các chức năng chế giễu và khai thác từ thư viện chuẩn.
Đây là một trường hợp cụ thể mà tôi đang xử lý trong 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);
}
Đó là chuyện nhỏ để kiểm tra: tiêm các đối tượng giả hoặc gián điệp làm texCompiler
và pdfMerger
là một miếng bánh vì chức năng thực sự không làm được gì nhiều. Tất cả những gì tôi có thể kiểm tra là cả hai chức năng được gọi theo đúng trình tự.
Mặc dù vậy, nó không cứu tôi khỏi việc kiểm tra chức năng texCompiler
và pdfMerger
chức năng của tôi . Họ trông giống như thế:
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);
});
});
Đây là điều có thật, và nó là một nỗi đau lớn hơn để kiểm tra. Tôi phải chế giễu child_process.spawn
một điệp viên để đảm bảo rằng nó được gọi với các đối số phù hợp, nhưng nó thực sự không làm gì cả, vì tôi không thực sự muốn hợp nhất bất kỳ tệp PDF nào khi chạy thử nghiệm và các giả của tôi phải phát ra đúng sự kiện để chức năng không bị kẹt.
Đây là những vấn đề tôi sẽ gặp phải nếu tôi không tiêm phụ thuộc vào đoạn mã đầu tiên của mình và sử dụng các chức năng này thay thế. Và nó thực sự có cảm giác như tôi đang đẩy vấn đề đi xa hơn mà không giải quyết nó.
Tôi có hiểu nhầm tiêm phụ thuộc? Tôi đang làm sai à?