【问题标题】:React testing library differences between clicks using userEvent, fireEvent and regular clicks使用 userEvent、fireEvent 和常规点击之间的点击反应测试库差异
【发布时间】:2021-04-20 10:59:41
【问题描述】:

在使用 React 学习 TDD 的过程中,我注意到在测试中触发点击元素的方法有很多种。可以通过fireEvent.click()userEvent.click()HTML_ELEMENT.click()完成。

它们都工作正常。经过一番研究,我了解到userEvent.click() 基本上在引擎盖下使用了fireEvent,它更适合自动化测试(例如cypress),而fireEvent.click() 更适合单元测试。

但我找不到userEventfireEvent 与可以使用的常规HTML_ELEMENT.click() 函数有何不同。

使用它们而不是使用常规点击功能可以获得什么好处?

【问题讨论】:

    标签: reactjs jestjs react-testing-library


    【解决方案1】:

    我认为fireEvent.click() 只会发出onClick,而userEvent.click() 会发出当用户clicks 发生时会发生的各种事件。

    这是点击标签时触发的功能之一:

    function clickLabel(label, init, {clickCount}) {
      if (isLabelWithInternallyDisabledControl(label)) return
    
      fireEvent.pointerDown(label, init)
      fireEvent.mouseDown(
        label,
        getMouseEventOptions('mousedown', init, clickCount),
      )
      fireEvent.pointerUp(label, init)
      fireEvent.mouseUp(label, getMouseEventOptions('mouseup', init, clickCount))
      fireEvent.click(label, getMouseEventOptions('click', init, clickCount))
      // clicking the label will trigger a click of the label.control
      // however, it will not focus the label.control so we have to do it
      // ourselves.
      if (label.control) focus(label.control)
    }
    

    简而言之,fireEvent.clickuserEvent.click 中使用的步骤之一,还有更多步骤

    你可以在这里阅读源代码:https://github.com/testing-library/user-event/blob/master/src/click.js

    这里有更多来自源代码的代码,这些代码将在userEvent.click 上发生

    function clickElement(element, init, {clickCount}) {
      const previousElement = getPreviouslyFocusedElement(element)
      fireEvent.pointerDown(element, init)
      if (!element.disabled) {
        const continueDefaultHandling = fireEvent.mouseDown(
          element,
          getMouseEventOptions('mousedown', init, clickCount),
        )
        if (
          continueDefaultHandling &&
          element !== element.ownerDocument.activeElement
        ) {
          if (previousElement && !isFocusable(element)) {
            blur(previousElement, init)
          } else {
            focus(element, init)
          }
        }
      }
      fireEvent.pointerUp(element, init)
      if (!element.disabled) {
        fireEvent.mouseUp(
          element,
          getMouseEventOptions('mouseup', init, clickCount),
        )
        fireEvent.click(element, getMouseEventOptions('click', init, clickCount))
        const parentLabel = element.closest('label')
        if (parentLabel?.control) focus(parentLabel.control, init)
      }
    }
    

    【讨论】:

    • 但这两个与常规的click()函数有什么不同
    • @ZaidShawahin 不同之处在于,当您使用userEvent.click 时会触发更多events,这更接近用户点击时发生的情况。例如,如果您在mouseDown 上有一个eventListener,在您使用fireEvent.click 时不会触发,但在您使用userEvent.click 时会触发
    • 也许我的问题并不清楚,感谢您解释 fireEventuserEvent 之间的区别,但目前尚不清楚使用它们两者或使用常规 HTML 之间有什么区别元素点击功能?
    • 我来到这里对您的原始问题感到好奇,HTML_ELEMENT.click() 有何不同,在引擎盖下似乎没有区别。我可能是错的,但是如果您浏览 @testing-library/dom (events.js) 中的 fireEvent 代码,看起来它正在使用提供的方法进行键值查找。我认为从编码实践的角度来看,保持一致性很有用,但是是的,这对我来说有点头疼,我找不到 fireEvent[event] 和 HTML_Element[event] 之间的任何真正区别(用户正如 Taghi 指出的那样,事件自然是另一回事)。
    猜你喜欢
    • 2020-11-22
    • 2020-12-20
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多