reactjs - 如何在我的单元测试中模拟点击 react-leaflet 标记?

标签 reactjs testing leaflet react-leaflet

我有这个示例 react-leaflet map 实现,它呈现 map 和可以点击的标记。

import React from 'react';
import { Map, TileLayer, Marker } from 'react-leaflet';


export default class ScoutPlayers extends React.Component {
  render() {
    const state = {
        lat: 51.505,
        lng: -0.09,
        zoom: 13,
    };

    const position = [state.lat, state.lng]
    return (
      <Map center={position} zoom={state.zoom}>
        <TileLayer
          attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url='https://{s}.tile.openstreetmap.se/hydda/full/{z}/{x}/{y}.png'
        />
          <Marker position={position} value={{id: 5}} onClick={(event) => {console.log(event.target.options.value)}} />
      </Map>
    )
  }
}

我得到了一个简单的单元测试,应该测试点击调用函数。

import { mount } from 'enzyme';
import { Marker } from 'react-leaflet';
import ScoutPlayers from './ScoutPlayers';

describe('when displaying scout players map', () => {
    let scoutPlayers;
    beforeAll(() => {
        scoutPlayers = mount(<ScoutPlayers/>);
      });

    it('should call the api when player marker clicked', () => {  
        const player = scoutPlayers.find(Marker);
        expect(player).toHaveLength(1);
        player.simulate('click');
    });
})

simulate('click') 上出现以下错误

TypeError:无法读取 null 的属性“__reactInternalInstance$iexoharntw”

关于如何解决这个问题的任何想法?我认为 mount 应该正确地创建 Marker 元素,以便它可以被点击。

我在使用 GoogleMaps 及其 Marker 时遇到了类似的问题,因为无法单击该元素,因为它的某些属性已初始化为 null。我想我的另一个问题是如何正确测试这种组件,因为它有一些关键的业务逻辑?

最佳答案

我有同样的问题,尽管我能够使用 shallow() 而不是 mount() 获得所需的行为。但是我对这个解决方案不满意,因为我已经阅读了 it is not the best practice .

无论如何,这是它的代码:

import { shallow } from 'enzyme';
import { Marker } from 'react-leaflet';
import ScoutPlayers from './ScoutPlayers';

it('does something on marker click', () => {    
    const onMarkerClick = jest.fn();
    const component = shallow(<ScoutPlayers onMarkerClick={onMarkerClick}/>);
    // first() in case there are more than one 
    const marker = component.find(Marker).first();
    marker.simulate('click');
    expect(onMarkerClick).toBeCalledTimes(1);
});

希望这会有所帮助,我知道这个问题很老,但我想分享一下,因为我今天早些时候提到了它。

关于reactjs - 如何在我的单元测试中模拟点击 react-leaflet 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56552649/

相关文章:

javascript - 如何在 React Native/Redux 中使用推送路由为 NavigationStateUtils 创建唯一键?

javascript - .map 中的条件 if 语句

Bash 测试参数是否存在

angular - 获取以 Angular 6 表示的 Leaflet map 上的光标位置坐标

r - 如何为 R 中传单中的数值变量设置不对称颜色渐变

javascript - 在子安装上设置父状态是一种反模式吗?

reactjs - 获取 Material UI 左侧每页的表格分页按钮和行

javascript - 如何在 map 容器的特定位置显示目标位置

r - 缺失值 true/false : error in loop not in one-off

java - 使用 Android Espresso 进行测试时如何单击操作栏项目?