我有一个针对以JSX文件编写的TSX文件的测试,该测试由于意外的令牌而无法运行:
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".
我有另一个用JSX编写的测试,该测试可以运行。我正在使用React Testing Library,但我认为这不是问题,因为文件导入测试失败。
堆栈跟踪:
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)`
最佳配置:
module.exports = {
moduleDirectories: [
'node_modules'
],
transform: {
"\\.tsx?$": "ts-jest",
"\\.jsx?$": "babel-jest",
},
globals: {
"ts-jest": {
"tsConfig": '<rootDir>/tsconfig.json'
}
}
}
TS配置:
{
"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"
}
}
答案 0 :(得分:1)
经过一段时间的摸索,看起来问题出在lodash-es软件包和Jest不支持ES模块。这里提到:https://github.com/facebook/jest/issues/4842
使用@CarlosCrespo答案作为基础,我还必须告诉babel在使用transformIgnorePatterns
属性进行转译时,不要忽略lodash-es:
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$"
],
}
除此之外,我还需要在另一个错误之后更新我的 tsconfig.json -使用TypeScript时,Cannot read property createElement of undefined
引起了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"]
}
答案 1 :(得分:0)
看起来您必须将其添加到Jest配置文件中
"transform": {
"\\.tsx?$": "ts-jest",
"\\.jsx?$": "babel-jest", // if you have jsx tests too
},
"globals": {
"ts-jest": {
"tsConfig": pathToYourTsConfigFile
}
}
此处的更多信息:https://jestjs.io/docs/en/configuration.html#transform-object-string-pathtotransformer-pathtotransformer-object和此处https://kulshekhar.github.io/ts-jest/user/config/
答案 2 :(得分:0)
此后,我发现了lodash-es特定情况的另一种替代方法。您可以使用普通的lodash库,只需导入所需的函数即可。然后,您可以使用lodash-es软件包,而无需使用transformIgnorePatterns。
例如:
import camelCase from 'lodash/camelCase';
camelCase('my string');