我有一个react组件,可以导入c3并建立一个c3图表。工作正常,我可以看到c3图表。
我试图用Jest测试我的react代码,所以我为我的react组件启动了一个简单的测试,只是一个组件的导入和验证组件是'truthy'(不是nullnot undefined)的测试,但当我试图运行测试时,我得到以下错误。
● Test suite failed to run
TypeError: Cannot read property 'prototype' of undefined
at node_modules/c3/c3.js:3578:29
at node_modules/c3/c3.js:4266:5
at node_modules/c3/c3.js:3:83
at Object.<anonymous> (node_modules/c3/c3.js:6:2)
at Object.<anonymous> (src/ChartPanel.tsx:2075:49)
at Object.<anonymous> (src/module.ts:131:25)
at Object.<anonymous> (src/module.test.ts:1:1)
有什么办法吗?我在这里遗漏了什么?
例子:这里是使用一个react示例应用的代码,只是修改了它,以包含一个带有简单的c3图表的自定义组件。
App. js
import React from 'react';
import './App.css';
import { Chart } from './Chart';
function App() {
return (
<div className="App">
<div className="App-link-container">
<a className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer">
Learn React
</a>
</div>
<Chart />
</div>
);
}
export default App;
Chart.js (带有非常简单的c3图表的组件)
import React, { PureComponent } from 'react';
import c3 from 'c3';
export class Chart extends PureComponent {
_chart;
componentDidMount() {
this._renderChart();
}
componentDidUpdate() {
this._renderChart();
}
_renderChart() {
this._chart = c3.generate({
bindto: '#chart',
data: {
columns: [
['data1', 30, 200, 100, 400, 150, 250],
['data2', 50, 20, 10, 40, 15, 25]
]
}
});
}
render() {
return <div id="chart">hi</div>;
}
}
测试(只是验证'学习React'链接是否在文档上。似乎在导入App.js处的Chart组件时已经出错了。)
import React from 'react';
import { render } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
const { getByText } = render(<App />);
const linkElement = getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
Jest在package.json中的配置如下。
"jest": {
"roots": [
"<rootDir>/src"
],
"collectCoverageFrom": [
"src/**/*.{js,jsx,ts,tsx}",
"!src/**/*.d.ts"
],
"setupFiles": [
"react-app-polyfill/jsdom"
],
"setupFilesAfterEnv": [
"<rootDir>/src/setupTests.js"
],
"testMatch": [
"<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}",
"<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}"
],
"testEnvironment": "jest-environment-jsdom-fourteen",
"transform": {
"^.+\\.(js|jsx|ts|tsx)$": "<rootDir>/node_modules/babel-jest"
},
"transformIgnorePatterns": [
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$",
"^.+\\.module\\.(css|sass|scss)$"
],
"modulePaths": [],
"moduleNameMapper": {
"^react-native$": "react-native-web",
"^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"
},
"moduleFileExtensions": [
"web.js",
"js",
"web.ts",
"ts",
"web.tsx",
"tsx",
"json",
"web.jsx",
"jsx",
"node"
],
"watchPlugins": [
"jest-watch-typeahead/filename",
"jest-watch-typeahead/testname"
]
}
而setupTests.js没有什么特别的地方,只有下面这句话
import '@testing-library/jest-dom/extend-expect';
有一个类似的问题。https:/github.comthymikeejest-preset-angularissues113。
这是因为jsdom没有提供svg相关api的实现。如果你跟踪c3.js的stacktrace,你会发现它是指向正确的
你只需要在下面提供需要的存根c3就可以了 setupTests.js
:
window.SVGPathElement = jest.fn();
附带说明:更好的做法是将 setupTests.js
其他地方,这样就不会被编译或出版。