Mocha + TypeScript: Cannot use import statement outside a module
Solution 1
I was able to test thanks to the @types/chai-http – Can't use ES6 import GitHub issue's answer.
I added a second TypeScript configuration file tsconfig.testing.json
with the following information:
{
"compilerOptions": {
"module": "commonjs",
"target": "es2015",
"lib": ["es2017"],
"declaration": false,
"noImplicitAny": false,
"removeComments": true,
"inlineSourceMap": true,
"moduleResolution": "node"
},
"include": ["scripts/**/*.ts", "src/**/*.ts", "node_modules/lodash-es/**/*.js"]
}
Then I changed my package.json
scripts as:
"test": "env TS_NODE_PROJECT=\"tsconfig.testing.json\" mocha --require ts-node/register 'src/test/**/*.ts'",
Finally I changed the test file like:
import * as chai from 'chai';
import 'chai-http';
import server from '../app';
// Assertions
chai.should();
chai.use(require('chai-http'));
Well, running the tests works now.
Solution 2
Had the same issue and almost gave up using Mocha with TypeScript (in our case Angular 9).
This is what helped me:
In tsconfig.json
:
Replaced this:
"module": "esnext",
with this:
"module": "commonjs",
Also here I found a working example of Mocha with TypeScript and used the tsconfig
file from there to compare with mine:
https://medium.com/@RupaniChirag/writing-unit-tests-in-typescript-d4719b8a0a40
Solution 3
Ensure you have .mocharc.json
in your project:
{
"extension": ["ts"],
"timeout": 5000,
"exit": true,
"require": "ts-node/register"
}
(see also https://github.com/mochajs/mocha-examples/tree/master/packages/typescript#es-modules)
Solution 4
Also had this problem and found I didn't have to switch to commonJS, just had to enable ESM:
npm install --save-dev esm
./node_modules/mocha/bin/mocha -r esm -r ts-node/register "src/**/*Test.ts"
Related videos on Youtube
Maramal
Updated on July 09, 2022Comments
-
Maramal almost 2 years
I was watching this video in order to learn how to add some simple tests to my Express routes but I am getting all kind of errors while executing a test. The error is:
import * as chai from 'chai';
^^^^^^
SyntaxError: Cannot use import statement outside a module
I have read some similar Stack Overflow questions and GitHub issues but I didn't find a solution for my own application. Finally I found Mocha documentation on GitHub regarding ES modules but it didn't work:
I created the app using TypeScript and CommonJS module to transpile, so I added
"test": "env TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha src/test/*.ts"
to thepackage.json
scripts but I am getting the same error every time. I am usingts-node
as a server.Anyway, this is my
tsconfig.json
file:{ "compilerOptions": { "sourceMap": true, "target": "es6", "module": "commonjs", "outDir": "./dist", "rootDir": "./src" }, "exclude": [ "node_modules" ] }
And this is the
src/test/mi-route.ts
file:import * as chai from 'chai'; import * as chaiHttp from 'chai-http'; import server from '../app'; // Assertions chai.should(); chai.use(chaiHttp); describe('API Users', () => { // Test Route GET describe('GET /api/admin/users', () => { it('Should return all the users', done => { chai.request(server) .get('/api/admin/users') .end((err, response) => { response.should.have.status(200); response.body.should.be.a('object'); done(); }); }); }); });
An this is my
package.json
scripts:"scripts": { "dev": "ts-node-dev src/app.ts", "start": "node dist/app.js", "test": "env TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha src/test/*.ts", "build": "tsc -p" },
So... any suggestions? Should I change Common JS Module? Thanks in advance
-
Justin Harris about 3 yearsMaybe you should be using
ts-mocha
to run your tests instead ofmocha
?
-
-
Matthew Peterson almost 4 yearsComparing my file with the one from the link solved my issue. Thanks!
-
Luke almost 4 yearsI spent over a day pulling my hair out over this. This fixed everything!!!
-
Xavier Leprêtre over 3 yearsWorked for me, after I fixed your typo:
tsconfig.testing.json
, instead oftscconfig.testing.json
. -
peterhil almost 3 yearsApparently this is not recommended any more: github.com/mochajs/mocha/issues/4594#issuecomment-791525500
-
peterhil almost 3 yearsYou could also have the second file under test dir:
test/tsconfig.json