Skip to content

Commit e27418c

Browse files
felixgery
authored andcommitted
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.
1 parent a59483b commit e27418c

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/node.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@
238238
var id = resolved[0];
239239
var filename = resolved[1];
240240

241+
var cachedModule = moduleCache[filename];
242+
if (cachedModule) return cachedModule.exports;
243+
241244
// With natives id === request
242245
// We deal with these first
243246
if (natives[id]) {
@@ -253,9 +256,6 @@
253256
return requireNative(id);
254257
}
255258

256-
var cachedModule = moduleCache[filename];
257-
if (cachedModule) return cachedModule.exports;
258-
259259
var module = new Module(id, parent);
260260
moduleCache[filename] = module;
261261
module.load(filename);

test/simple/test-require-cache.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var common = require('../common');
2+
var assert = require('assert');
3+
4+
(function testInjectFakeModule() {
5+
var relativePath = '../fixtures/semicolon';
6+
var absolutePath = require.resolve(relativePath);
7+
var fakeModule = {};
8+
9+
require.cache[absolutePath] = {exports: fakeModule};
10+
11+
assert.strictEqual(require(relativePath), fakeModule);
12+
})();
13+
14+
15+
(function testInjectFakeNativeModule() {
16+
var relativePath = 'fs';
17+
var fakeModule = {};
18+
19+
require.cache[relativePath] = {exports: fakeModule};
20+
21+
assert.strictEqual(require(relativePath), fakeModule);
22+
})();

0 commit comments

Comments
 (0)