testdouble
Version:
A minimal test double library for TDD with JavaScript
69 lines (61 loc) • 2.56 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path");
const quibble = require("quibble");
const theredoc = require("theredoc");
const log_1 = require("../../log");
quibble.ignoreCallsFromThisFile();
function requireActual(modulePath) {
const absolutePath = quibble.absolutify(modulePath);
let absolutePathLoadError, moduleNameLoadError;
// 1. Try just following quibble's inferred absolute path
try {
return require(absolutePath);
}
catch (e) {
absolutePathLoadError = e;
}
// 2. Try requiring a built-in or npm module of the given `modulePath` name
try {
return require(require.resolve(modulePath, {
paths: [
path_1.default.join(process.cwd(), 'node_modules')
]
}));
}
catch (e) {
moduleNameLoadError = e;
}
// 3. Give up, print a fancy error
log_1.default.error('td.replace', theredoc `
failed to load the module being replaced.
Why am I seeing this?
------------------------
You called \`td.replace('${modulePath}')\`, but we failed to locate that
module. How td.replace() works is that it first loads the actual module
being faked in order to properly imitate it (i.e. to see whether it exports
a default function, or an object of other named functions, and so on).
How do I fix it?
----------------
You probably specified a path that could not be resolved relative
to your test file (or whatever listing from which you called \`td.replace()\`).
Be sure you didn't specify the path relative to the subject under test!
First, we tried to absolutify that path and require it, with:
\`require('${absolutePath}')\`
But requiring that absolute path threw this error:
"${firstLineOf(absolutePathLoadError.message)}"
Next, we tried to require it as you specified it (in case it's the name of
a Node.js built-in or an npm package), with:
\`require('${modulePath}')\`
But that threw this error:
"${firstLineOf(moduleNameLoadError.message)}"
Make sure the path specified exists (either relative to the call-site or
as an installed module). If any of the paths above seem to be internal to
testdouble.js or a dependency, that's probably a bug and you should open an
issue.
`, 'https://github.com/testdouble/testdouble.js#module-replacement-with-nodejs');
}
exports.default = requireActual;
function firstLineOf(s) {
return s ? s.split('\n')[0] : s;
}
;