I am trying to setup a project and run tests with mocha with mjackson/expect library for assertion. My code to be tested is:
// inside src/lib/math.ts
export function sum(a: number, b: number): number {
return a + b;
}
and my test is as follows:
// inside src/tests/math.tests.ts
/// <reference path="../../typings/main/ambient/mocha/mocha.d.ts" />
/// <reference path="../../typings/main/ambient/expect/expect.d.ts" />
import expect from 'expect';
import {sum} from '../lib/math';
describe('sum', () => {
it('should add two numbers', () => {
expect(sum(1, 2)).toEqual(3);
});
});
I am able to compile the code with tsc using the following command:
find src -name *.ts | xargs tsc --declaration --sourceMap --module commonjs --target es5 --listFiles --outDir .
However when I run mocha from my project directory using the following command:
mocha tests
I see the following error in my tests:
TypeError: expect_1.default is not a function
When I open the compiled version of my math.tests.ts, I see the following line at the top of the transpiled code:
var expect_1 = require('expect');
This is fine and as expected. However, when I look inside the test where expect is called, I see the following line:
expect_1.default(math_1.sum(1, 2)).toEqual(3);
Now this line of code seems wrong. The expect library is bundled as an ES6 module and the expect function is a default export from the module.
However, TypeScript compiler has emitted code into my test where it attempts to access a default attribute on expect_1 which is an import from the expect library. The expect_1 reference itself is the default exported function I need in my tests and not expect_1.default which is invalid.
A point to note is, if I modified my math.tests.ts to import expect using the older require syntax. Everything works fine.
Please help me understand what I am missing.
P.S. I use TypeScript 1.8.2 with Node v4.3.1.
With TypeScript 3.8, you can import a type using the import statement, or using import type .
When set to true, allowSyntheticDefaultImports allows you to write an import like: ts. import React from "react"; instead of: ts.
The error "Module can only be default-imported using esModuleInterop flag" occurs when we try to import a CommonJS module into an ES6 module. To solve the error, set the esModuleInterop option to true in your tsconfig. json file.
The "Module has no default export" error occurs when we try to import as default from a module that doesn't have a default export. To solve the error make sure the module has a named export and wrap the import in curly braces, e.g. import {myFunction} from './myModule' .
It looks like the expect namespace type is wrong in the npm package (@types/expect) You can make small workaround to save type checking:
import * as _expect from 'expect';
const expect = _expect as any as typeof _expect.default;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With