Это тривиальный пример, который иллюстрирует суть моей проблемы:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Я пытаюсь написать модульный тест для этого кода. Как я могу смоделировать требование для innerLib
без макетирования require
функции полностью?
Так что это я пытаюсь смоделировать глобальное require
и выяснить, что это не сработает даже для этого:
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;
}
};
Проблема в том, что require
функция внутри underTest.js
файла фактически не была отключена. Это все еще указывает на глобальную require
функцию. Таким образом, кажется, что я могу смоделировать require
функцию только в том же файле, в котором выполняю макетирование . Если я использую глобальный элемент require
для включения чего-либо, даже после того, как я переопределил локальную копию, требуемые файлы по-прежнему будут иметь глобальная require
ссылка.
global.require
. Переменные записываютсяmodule
по умолчанию, так как модули находятся в области видимости модулей.