'Mocha testing Typescript source file: unable to import node modules

I have setup mocha to test typescript source files. I have successfully run a test on one file that only imported source files, but I'm seeing a failure running a test that imports a node module.

I am running this on the command line to run the tests:

mocha -r ts-node/register -r jsdom-global/register spec/**/**.spec.ts

In the test that is failing, the source file that it is testing has this import

import * as angular from "angular";

And when the test is run, I see this error:

ReferenceError: angular is not defined
    at Object.<anonymous> (/Users/bsacamano/testRepos/myApp/node_modules/angular/index.js:2:18)
    at Module._compile (node:internal/modules/cjs/loader:1103:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1157:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/bsacamano/testRepos/myApp/web/common/default/unsecured/shared-modules/services/flexlabel/flex.service.ts:1:1)
    at Module._compile (node:internal/modules/cjs/loader:1103:14)
    at Module.m._compile (/Users/bsacamano/testRepos/myApp/node_modules/ts-node/src/index.ts:1455:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1157:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/bsacamano/testRepos/myApp/node_modules/ts-node/src/index.ts:1458:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/bsacamano/testRepos/myApp/spec/shared-modules/services/flexlabel/flex.service.spec.ts:1:1)
    at Module._compile (node:internal/modules/cjs/loader:1103:14)
    at Module.m._compile (/Users/bsacamano/testRepos/myApp/node_modules/ts-node/src/index.ts:1455:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1157:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/bsacamano/testRepos/myApp/node_modules/ts-node/src/index.ts:1458:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.exports.requireOrImport (/Users/bsacamano/testRepos/myApp/node_modules/mocha/lib/nodejs/esm-utils.js:49:16)
    at async Object.exports.loadFilesAsync (/Users/bsacamano/testRepos/myApp/node_modules/mocha/lib/nodejs/esm-utils.js:91:20)
    at async singleRun (/Users/bsacamano/testRepos/myApp/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async Object.exports.handler (/Users/bsacamano/testRepos/myApp/node_modules/mocha/lib/cli/run.js:370:5)

I have a different test for a source file that has these imports

import {IHttpService, IPromise, IRequestConfig} from 'angular';

and that test completes without error.

Also, the code works in production; I'm seeing that angular is defined and working.

Any ideas on what I can do to get the test to pass?

Update:

I think it has to do with the clown show that is bare imports. My web app is built with webpack, and webpack takes care of converting those imports when bundling.

Out of desperation, I tried building a bundle for my tests (which I really didn't want to do since I'm not distributing the file, but you know). I then ran mocha on the bundle, but I'm still getting the same error, angular is not defined, just with a different stack trace.

Update 2: Even if I were to remove the "bare" import and replace with an import of the script relative to the file, it doesn't work. I don't get the ReferenceError, but the import just doesn't happen; if I console.log(angular); after importing it, I see that it is an empty object.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source