单元测试React单击组件外部 [英] Unit testing React click outside component

查看:175
本文介绍了单元测试React单击组件外部的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用此答案中的代码解决组件外部的点击问题:

Using the code from this answer to solve clicking outside of a component:

componentDidMount() {
    document.addEventListener('mousedown', this.handleClickOutside);
}

componentWillUnmount() {
    document.removeEventListener('mousedown', this.handleClickOutside);
}

setWrapperRef(node) {
    this.wrapperRef = node;
}

handleClickOutside(event) {
    if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {
        this.props.actions.something() // Eg. closes modal
    }
}

我无法弄清楚如何单位测试不愉快的路径所以警报没有运行,到目前为止我已经得到了:

I can't figure out how to unit test the unhappy path so the alert isn't run, what i've got so far:

it('Handles click outside of component', () => {
  props = {
    actions: {
      something: jest.fn(),
    }
  }
  const wrapper = mount(
    <Component {... props} />,
  )
  expect(props.actions.something.mock.calls.length).toBe(0)

  // Happy path should trigger mock

  wrapper.instance().handleClick({
    target: 'outside',
  })

  expect(props.actions.something.mock.calls.length).toBe(1)  //true

  // Unhappy path should not trigger mock here ???

  expect(props.actions.something.mock.calls.length).toBe(1)
})

我试过:


  • 发送 wrapper.html()

  • .find ing节点并发送(不模拟 event.target

  • .simulate ing 点击内部元素的(不触发事件监听器)

  • sending through wrapper.html()
  • .finding a node and sending through (doesn't mock a event.target)
  • .simulateing click on an element inside (doesn't trigger event listener)

我确定我错过了一些小事,但我找不到任何例子。

I'm sure i'm missing something small but I couldn't find an example of this anywhere.

推荐答案

import { mount } from 'enzyme'
import React from 'react'
import ReactDOM from 'react-dom'

it('Should not call action on click inside the component', () => {
  const map = {}

  document.addEventListener = jest.fn((event, cb) => {
    map[event] = cb
  })

  const props = {
    actions: {
      something: jest.fn(),
    }
  }

  const wrapper = mount(<Component {... props} />)

  map.mousedown({
    target: ReactDOM.findDOMNode(wrapper.instance()),
  })

  expect(props.actions.something).not.toHaveBeenCalled()
})

github上这个酶问题的解决方案。

The solution from this enzyme issue on github.

这篇关于单元测试React单击组件外部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆