----------- CẬP NHẬT ---------------
node-sandbox công trình trên gốc giống như được nêu dưới đây nhưng được bao bọc trong một mô-đun đẹp. Tôi thấy rất tuyệt khi làm việc cùng.
--------------- awnser chi tiết ---------------
Sau nhiều thử nghiệm Tôi có tìm thấy cách tốt nhất để kiểm tra các mô-đun nút trong sự cô lập trong khi chế nhạo mọi thứ là sử dụng phương pháp của Vojta Jina để chạy từng mô-đun bên trong vm với ngữ cảnh mới như được giải thích here.
với module vm thử nghiệm này:
var vm = require('vm');
var fs = require('fs');
var path = require('path');
/**
* Helper for unit testing:
* - load module with mocked dependencies
* - allow accessing private state of the module
*
* @param {string} filePath Absolute path to module (file to load)
* @param {Object=} mocks Hash of mocked dependencies
*/
exports.loadModule = function(filePath, mocks) {
mocks = mocks || {};
// this is necessary to allow relative path modules within loaded file
// i.e. requiring ./some inside file /a/b.js needs to be resolved to /a/some
var resolveModule = function(module) {
if (module.charAt(0) !== '.') return module;
return path.resolve(path.dirname(filePath), module);
};
var exports = {};
var context = {
require: function(name) {
return mocks[name] || require(resolveModule(name));
},
console: console,
exports: exports,
module: {
exports: exports
}
};
vm.runInNewContext(fs.readFileSync(filePath), context);
return context;
};
người ta có thể kiểm tra mỗi mô-đun với bối cảnh riêng của mình và dễ dàng còn sơ khai ra tất cả dependencys bên ngoài.
fsMock = mocks.createFs();
mockRequest = mocks.createRequest();
mockResponse = mocks.createResponse();
// load the module with mock fs instead of real fs
// publish all the private state as an object
module = loadModule('./web-server.js', {fs: fsMock});
Tôi đặc biệt khuyên bạn nên viết các bài kiểm tra hiệu quả một cách độc lập. Chỉ các bài kiểm tra chấp nhận mới có thể đạt được toàn bộ ngăn xếp. Các bài kiểm tra đơn vị và tích hợp nên kiểm tra các phần riêng biệt của hệ thống.
Nguồn
2012-06-03 11:15:54
Cảm ơn câu trả lời tuyệt vời! Tuy nhiên tôi có một câu hỏi khác: Tôi đã không thể tận dụng kỹ thuật này để ghi đè các chức năng riêng tư bằng các chức năng tùy chỉnh của riêng tôi trong mô-đun đang được thử nghiệm. nó kết quả trong hai chức năng: một trong phạm vi địa phương và một trong phạm vi toàn cầu, với các mô-đun được kiểm tra luôn gọi phiên bản toàn cầu/bản gốc. – Attilah