From e27418ca3f1f4700a457145de899c0d67343ee77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Geisend=C3=B6rfer?= Date: Mon, 13 Dec 2010 23:56:16 +0100 Subject: [PATCH] Prefer require.cache over native module cache This patch changes node's module loading behavior so that the require.cache is always the first place to consider when loading a module. The motivation for this change is to help people who are writing focused tests for their node.js applications, and need a mechanism to inject test doubles to replace native node.js modules. --- src/node.js | 6 +++--- test/simple/test-require-cache.js | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 test/simple/test-require-cache.js diff --git a/src/node.js b/src/node.js index 334d8c5ee..43ccdb032 100644 --- a/src/node.js +++ b/src/node.js @@ -238,6 +238,9 @@ var id = resolved[0]; var filename = resolved[1]; + var cachedModule = moduleCache[filename]; + if (cachedModule) return cachedModule.exports; + // With natives id === request // We deal with these first if (natives[id]) { @@ -253,9 +256,6 @@ return requireNative(id); } - var cachedModule = moduleCache[filename]; - if (cachedModule) return cachedModule.exports; - var module = new Module(id, parent); moduleCache[filename] = module; module.load(filename); diff --git a/test/simple/test-require-cache.js b/test/simple/test-require-cache.js new file mode 100644 index 000000000..a069d0a79 --- /dev/null +++ b/test/simple/test-require-cache.js @@ -0,0 +1,22 @@ +var common = require('../common'); +var assert = require('assert'); + +(function testInjectFakeModule() { + var relativePath = '../fixtures/semicolon'; + var absolutePath = require.resolve(relativePath); + var fakeModule = {}; + + require.cache[absolutePath] = {exports: fakeModule}; + + assert.strictEqual(require(relativePath), fakeModule); +})(); + + +(function testInjectFakeNativeModule() { + var relativePath = 'fs'; + var fakeModule = {}; + + require.cache[relativePath] = {exports: fakeModule}; + + assert.strictEqual(require(relativePath), fakeModule); +})();