【问题标题】:@testing-library/React : Clicking outside of component not working@testing-library/React:在组件外部单击不起作用
【发布时间】:2021-06-11 03:30:53
【问题描述】:

我正在使用 react 测试库来测试我使用 FluentUI 构建的组件。

这里是链接: https://codesandbox.io/s/keen-borg-2tqmj?file=/src/App.spec.js

代码基本上是来自 FluentUI 文档站点的Dialog 组件示例代码的粘贴 sn-p。我正在测试的行为是:

  1. 用户打开对话框
  2. 用户在对话框外点击
  3. onDimiss 组件的属性应该被触发。

当我手动使用它时它可以工作,但是我似乎无法使用测试库模拟组件外部的点击。

我尝试使用this post 中提到的userEvent.click(document.body),但没有成功

有人知道如何进行测试吗?

【问题讨论】:

  • this post 链接具有相同的codeandbox url
  • 感谢提醒。修复链接
  • 没问题,如果我的回答对你有用,请告诉我

标签: reactjs unit-testing dialog react-testing-library testing-library


【解决方案1】:

它不起作用,因为 Dialog 组件没有监听 body 上的 onClick 事件,所以在这种情况下你需要做的是找到被点击的实际元素,观察你的 dom '会发现覆盖是一个div,上面有一些覆盖类。

        <div
          class="ms-Modal is-open ms-Dialog root-94"
          role="document"
        >
          <div
            aria-hidden="true"
            class="ms-Overlay ms-Overlay--dark root-99"
          />

现在的问题是找到一种选择它的方法。不幸的是,在 RTL 中你不能通过它们的 className 来选择元素,所以你需要使用另一个选择器;在这种情况下,我们可以通过角色获取父元素,然后访问第一个子元素。

    const onDismiss = jest.fn();
    const { getByRole } = render(<App onDismiss={onDismiss} />);
    UserEvent.click(screen.getByText("Open Dialog"));
    const document = getByRole("document");
    UserEvent.click(document.firstChild);
    expect(onDismiss).toHaveBeenCalled();

https://codesandbox.io/s/hungry-joliot-tjcph?file=/src/App.spec.js

【讨论】:

  • 感谢您的解释。只是好奇您发布的代码框网址中的测试是否成功?我直接在代码和框中运行了您修改后的测试版本,但它仍然给了我相同的结果
  • @ShiCheng 不好意思忘记改了App组件代码,不小心保存了,你可以再检查一下,已经通过了
  • 我看到它过去了,为什么它现在过去了。非常感谢!
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2019-06-14
  • 2021-09-14
  • 2021-02-23
相关资源
最近更新 更多