用笑话测试实现react-leaflet映射的react组件的问题

Ram*_*res 8 reactjs jestjs react-native react-leaflet

当我尝试测试实现react-leaflet库的react组件时,遇到以下问题

    C:\digital-booking-ui\node_modules\react-leaflet\lib\index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { useMap, useMapEvent, useMapEvents } from './hooks.js';
                                                                                  ^^^^^^

SyntaxError: Unexpected token 'export'

  1 | import React from "react";
  2 | import { makeStyles } from "@material-ui/core";
> 3 | import { MapContainer, TileLayer, Marker, Popup, useMap } from "react-leaflet";
    | ^
  4 |
  5 | const Map = () => {
  6 |   const classes = useStyles();

  at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1728:14)
  at Object.<anonymous> (src/components/accomodation/Map.js:3:1)
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索问题,发现的建议对我不起作用。

当我尝试渲染与该库有关系的任何组件(例如 App.test.js)时,会发生此错误

import { render, screen, prettyDOM } from '@testing-library/react';
import '@testing-library/jest-dom/extend-expect'
import App from './App';
import { BrowserRouter } from 'react-router-dom';
import { ThemeProvider } from '@material-ui/core';
import theme from "./theme";

let component = null;

beforeEach(() => {
    component = render(
      <BrowserRouter>
        <ThemeProvider theme={theme}>
          <App />
        </ThemeProvider>
      </BrowserRouter>
    );
}
);

test('render App', () => {
  expect(component).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?似乎是 Jest 无法识别组件导出的问题

小智 5

在你jest.config.js添加这些行

"jest": {   
    "moduleNameMapper": {
      "react-leaflet": "<rootDir>/mocks/reactLeafletMock.js"
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后在“mocks”文件夹(或任何你想要的)中添加一个reactLeafletMock.js模块,该模块返回一个空对象

module.exports = {}
Run Code Online (Sandbox Code Playgroud)

应该没问题(对我有用)

您最终可以在对象中添加“react-leaflet”挂钩,以避免 Jest 中的其他错误

module.exports = {
    useMapEvents: () => {}
}
Run Code Online (Sandbox Code Playgroud)