使用jsodom和jest测试react-mapbox-gl

Rov*_*ion 6 jsdom typescript jestjs mapbox-gl-js

考虑我们具有以下Map组件。这在TypeScript中,但对于普通JavaScript也应如此。

import * as React from 'react';
import ReactMapboxGl from 'react-mapbox-gl';

const MapBox = ReactMapboxGl({
  accessToken: 'pk.<redacted>'
});

export default class Map extends React.Component {
  render() {
    return (
      <MapBox
        style="mapbox://styles/mapbox/streets-v9"
        zoom={[0]}
        containerStyle={{
          height: '500px',
          width: 'inherit'
        }}
      />);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,它是一些这样呈现的react应用程序的一部分:

import * as React from 'react';

export default class App extends React.Component {
  render() {
    return (
          <Map />
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

为了测试此设置,我们使用Jest和JSDOM。

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './App';

it('renders without crashing', () => {
  const div = document.createElement('div');
  ReactDOM.render(<App />, div);
});
Run Code Online (Sandbox Code Playgroud)

该测试将无法运行并产生以下输出:

    TypeError: window.URL.createObjectURL is not a function

      at Object.254.../../source/worker (node_modules/mapbox-gl/dist/mapbox-gl.js:509:100)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:762
      at Object.280.../ (node_modules/mapbox-gl/dist/mapbox-gl.js:561:28)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:762
      at Object.263../worker_pool (node_modules/mapbox-gl/dist/mapbox-gl.js:527:29)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:762
      at Object.191.../render/glyph_manager (node_modules/mapbox-gl/dist/mapbox-gl.js:383:809)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:762
      at Object.248.../geo/lng_lat (node_modules/mapbox-gl/dist/mapbox-gl.js:497:338)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:762
      at Object.72.../package.json (node_modules/mapbox-gl/dist/mapbox-gl.js:144:148)
      at s (node_modules/mapbox-gl/dist/mapbox-gl.js:1:711)
      at e (node_modules/mapbox-gl/dist/mapbox-gl.js:1:882)
      at node_modules/mapbox-gl/dist/mapbox-gl.js:1:900
      at Object.<anonymous>.i (node_modules/mapbox-gl/dist/mapbox-gl.js:1:177)
      at Object.<anonymous> (node_modules/mapbox-gl/dist/mapbox-gl.js:1:413)
      at Object.<anonymous> (node_modules/react-mapbox-gl/lib/map.js:21:16)
      at Object.<anonymous> (node_modules/react-mapbox-gl/lib/index.js:3:13)
      at Object.<anonymous> (src/Map.tsx:14:25)
      at Object.<anonymous> (src/NewOrder.tsx:21:13)
      at Object.<anonymous> (src/Routes.ts:17:18)
      at Object.<anonymous> (src/App.tsx:16:16)
      at Object.<anonymous> (src/App.test.tsx:6:169)
          at <anonymous>
Run Code Online (Sandbox Code Playgroud)

亲爱的读者,给您的问题很简单:是否可以解决此问题?我们可以使用接缝来注入模拟的MapBoxGL库吗?

我发现与此相关的问题在GitHub上的多个问题,但他们没有提供一个解决方案:12。有些人指向使用mapbox-gl-js-mock,而另一些人则认为它没有用,因为它也需要运行真正的浏览器。

JSDOM项目上还存在有关添加URL.createObjectURL 的相关问题,这也许可以解决潜在的问题。

met*_*eor 7

我有同样的问题,作为上市的时候我加入了下面的代码在这里我试块的顶部,它的工作。

jest.mock('mapbox-gl/dist/mapbox-gl', () => ({
   Map: () => ({})
}));
Run Code Online (Sandbox Code Playgroud)

  • [此问题](https://github.com/mapbox/mapbox-gl-js/issues/3436)也很重要。特别是,在我进行有效设置之前,我必须走得更远(如[此评论](https://github.com/mapbox/mapbox-gl-js/issues/3436#issuecomment-485535598)所建议的)。 (2认同)

Mor*_*kop 5

您可以将此添加到您的测试条目文件中 setupTest.ts

jest.mock('mapbox-gl/dist/mapbox-gl', () => ({
  GeolocateControl: jest.fn(),
  Map: jest.fn(() => ({
    addControl: jest.fn(),
    on: jest.fn(),
    remove: jest.fn(),
  })),
  NavigationControl: jest.fn(),
}));
Run Code Online (Sandbox Code Playgroud)