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 innerLib
bez require
całkowitego wyszydzania funkcji?
Więc to ja próbuję wyszydzić globalny require
i 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 require
funkcja wewnątrz underTest.js
pliku nie została w rzeczywistości wyszydzona. Nadal wskazuje na funkcję globalną require
. Wygląda więc na to, że mogę wyszydzać require
funkcję tylko w tym samym pliku, w którym robię mockowanie. Jeśli użyję globalnego require
do uwzględnienia czegokolwiek, nawet po nadpisaniu lokalnej kopii, wymagane pliki nadal będą miały globalne require
odniesienie.
global.require
. Zmienne zapisywanemodule
domyślnie, ponieważ moduły mają zasięg modułu.