Đây là một ví dụ tầm thường minh họa mấu chốt của vấn đề của tôi:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Tôi đang cố gắng viết một bài kiểm tra đơn vị cho mã này. Làm thế nào tôi có thể giả định yêu cầu cho innerLibmà không chế nhạo requirechức năng hoàn toàn?
Vì vậy, đây là tôi đang cố gắng chế giễu toàn cầu requirevà phát hiện ra rằng nó sẽ không hoạt động ngay cả để làm điều đó:
var path = require('path'),
vm = require('vm'),
fs = require('fs'),
indexPath = path.join(__dirname, './underTest');
var globalRequire = require;
require = function(name) {
console.log('require: ' + name);
switch(name) {
case 'connect':
case indexPath:
return globalRequire(name);
break;
}
};
Vấn đề là requirechức năng bên trong underTest.jstập tin thực sự chưa bị chế giễu. Nó vẫn chỉ đến requirechức năng toàn cầu . Vì vậy, có vẻ như tôi chỉ có thể giả lập requirechức năng trong cùng một tệp Tôi đang thực hiện chế độ giả. Nếu tôi sử dụng toàn cầu requiređể bao gồm mọi thứ, ngay cả khi tôi đã ghi đè lên bản sao cục bộ, các tệp được yêu cầu vẫn sẽ có requiretài liệu tham khảo toàn cầu .
global.require. Các biến được ghimoduletheo mặc định vì các mô-đun nằm trong phạm vi mô-đun.