Đâ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 innerLib
mà không chế nhạo require
chứ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 require
và 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à require
chức năng bên trong underTest.js
tập tin thực sự chưa bị chế giễu. Nó vẫn chỉ đến require
chức năng toàn cầu . Vì vậy, có vẻ như tôi chỉ có thể giả lập require
chứ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ó require
tài liệu tham khảo toàn cầu .
global.require
. Các biến được ghimodule
theo mặc định vì các mô-đun nằm trong phạm vi mô-đun.