当Jest测试包含c3 chart的react组件时,"TypeError: cannot read property 'prototype' of undefined"。

问题描述 投票:0回答:1

我有一个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';
javascript reactjs jestjs c3.js
1个回答
0
投票

有一个类似的问题。https:/github.comthymikeejest-preset-angularissues113。

这是因为jsdom没有提供svg相关api的实现。如果你跟踪c3.js的stacktrace,你会发现它是指向正确的

c3 adding prototype

你只需要在下面提供需要的存根c3就可以了 setupTests.js:

window.SVGPathElement = jest.fn();

附带说明:更好的做法是将 setupTests.js 其他地方,这样就不会被编译或出版。

© www.soinside.com 2019 - 2024. All rights reserved.