UNPKG

testdouble

Version:

A minimal test double library for TDD with JavaScript

69 lines (61 loc) 2.56 kB
"use strict"; 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; }