Oto trywialny przykład, który ilustruje sedno mojego problemu:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Próbuję napisać test jednostkowy dla tego kodu. Jak mogę wyszydzić wymaganie dla innerLibbez requirecałkowitego wyszydzania funkcji?
Więc to ja próbuję wyszydzić globalny requirei odkryć, że nawet to nie zadziała:
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;
}
};
Problem polega na tym, że requirefunkcja wewnątrz underTest.jspliku nie została w rzeczywistości wyszydzona. Nadal wskazuje na funkcję globalną require. Wygląda więc na to, że mogę wyszydzać requirefunkcję tylko w tym samym pliku, w którym robię mockowanie. Jeśli użyję globalnego requiredo uwzględnienia czegokolwiek, nawet po nadpisaniu lokalnej kopii, wymagane pliki nadal będą miały globalne requireodniesienie.
global.require. Zmienne zapisywanemoduledomyślnie, ponieważ moduły mają zasięg modułu.