I have a test for a test for a TSX file written in a JSX file which fails to run due to unexpected token:
Test suite failed to run
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
I have another test written in JSX for a JSX file which does run. I am using React Testing Library but I don't think this is the issue as the test fails on the file imports.
Stack trace:
export { default as add } from './add.js';
^^^^^^
SyntaxError: Unexpected token export
1 | import React from 'react';
> 2 | import { debounce } from 'lodash-es';
| ^
3 |
4 | interface Props {
5 | bodyContent?: string
at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:537:17)
at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:579:25)
at Object.<anonymous> (components/tsx/TestComponentTSX.tsx:2:1)`
Jest config:
module.exports = {
moduleDirectories: [
'node_modules'
],
transform: {
"\\.tsx?$": "ts-jest",
"\\.jsx?$": "babel-jest",
},
globals: {
"ts-jest": {
"tsConfig": '<rootDir>/tsconfig.json'
}
}
}
TS Config:
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true,
"allowSyntheticDefaultImports": true
}
}
TestComponentTSX.tsx
import React from 'react';
import { debounce } from 'lodash-es';
interface Props {
bodyContent?: string
}
function TestComponentTSX(props: Props) {
const clickHandler = (): void => {
console.log('I am being clicked!');
};
const debouncedClickHandler = debounce(clickHandler, 400)
return (
<div>
<h1>Hello World!</h1>
<p>{props.bodyContent || 'World...'}</p>
<button type="button" onClick={debouncedClickHandler}>Click me!</button>
</div>
)
}
export default TestComponentTSX;
TestComponentTSX.test.tsx
import React from 'react';
import { render } from '@testing-library/react';
import TestComponentTSX from './TestComponentTSX';
describe('The TSX component is testable', () => {
test('The component renders', () => {
// Arrange
const { getByText } = render(
<TestComponentTSX />
);
// Act
// Do something
// Assert
expect(getByText('Hello World!'));
})
});
package.json
{
"name": "jesttypescriptreact",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build-dev": "cross-env NODE_ENV=development webpack"
},
"author": "",
"license": "ISC",
"dependencies": {
"lodash-es": "^4.17.15",
"react": "^16.10.1",
"react-dom": "^16.10.1"
},
"devDependencies": {
"@babel/core": "^7.6.2",
"@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-proposal-object-rest-spread": "^7.6.2",
"@babel/preset-env": "^7.6.2",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.6.0",
"@testing-library/react": "^9.2.0",
"@types/jest": "^24.0.18",
"@types/lodash-es": "^4.17.3",
"@types/react-dom": "^16.9.1",
"babel-loader": "^8.0.6",
"cross-env": "^6.0.0",
"jest": "^24.9.0",
"ts-jest": "^24.1.0",
"ts-loader": "^6.2.0",
"typescript": "^3.6.3",
"webpack": "^4.41.0",
"webpack-cli": "^3.3.9"
}
}
After messing around with this for absolutely ages it looks like the problem was to do with the lodash-es package and Jest not supporting ES modules. This is mentioned here: https://github.com/facebook/jest/issues/4842
Using @CarlosCrespo answer as a basis I also had to tell babel not to ignore lodash-es when transpiling using the transformIgnorePatterns
property to give me the following:
jest.config.js
module.exports = {
moduleDirectories: [
'node_modules'
],
transform: {
"\\.tsx?$": "ts-jest",
"\\.jsx?$": "babel-jest", // if you have jsx tests too
},
globals: {
"ts-jest": {
"tsConfig": '<rootDir>/tsconfig.json'
}
},
transformIgnorePatterns: [
"[/\\\\]node_modules[/\\\\](?!lodash-es/).+\\.js$"
],
}
In addition to this I also needed to update my tsconfig.json after another error - Cannot read property createElement of undefined
was caused whilst using TypeScript: https://github.com/testing-library/react-testing-library/issues/374
tsconfig.json
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"lib": ["dom", "esnext"],
"module": "esnext",
"target": "es5",
"jsx": "react",
"esModuleInterop": true,
"allowJs": true,
"allowSyntheticDefaultImports": true
},
"exclude": ["node_modules"]
}