使用react-testing-library测试material ui popper时如何修复“TypeError: document.createRange is not a function”错误?

2024-04-08

我有一个材料用户界面TextField焦点打开时Popper。我正在尝试使用react-testing-library 来测试这种行为。

成分:

import ClickAwayListener from '@material-ui/core/ClickAwayListener';
import Grow from '@material-ui/core/Grow';
import Paper from '@material-ui/core/Paper';
import Popper from '@material-ui/core/Popper';
import TextField from '@material-ui/core/TextField';
import React from 'react';
import { ItemType } from './types';

export type TextFieldDropDownProps = {
    items: ItemType,
};

export function TextFieldDropDown(props: TextFieldDropDownProps) {
    const [searchTerm, setSearchTerm] = React.useState('');
    const [anchorEl, setAnchorEl] = React.useState(null);

    const handleSearchTermChange = (event: any) => {
        setSearchTerm(event.target.value);
    };

    const onFoucs = (event: any) => {
        setAnchorEl(event.currentTarget);
    };

    const handleClose = (event: any) => {
        setAnchorEl(null);
    };

    const popperTrans = ({ TransitionProps }: any) => {
        return (
          <Grow
            {...TransitionProps}
            style={{ transformOrigin: '0 0 0' }}
          >
            <Paper>
              <ul />
            </Paper>
          </Grow>
        );
    };

    const open = Boolean(anchorEl);
    return (
        <ClickAwayListener onClickAway={handleClose}>
            <div>
                <TextField
                    onChange={handleSearchTermChange}
                    onFocus={onFoucs}
                    value={searchTerm}
                    label='Search'
                />
                <Popper
                    open={open}
                    anchorEl={anchorEl}
                    transition={true}
                    disablePortal={true}
                    placement='bottom-start'
                    style={{zIndex: 999, minWidth: '100%'}}
                >
                    {popperTrans}
                </Popper>
            </div>
        </ClickAwayListener>
    );
}

Test:

import { fireEvent, render, wait } from '@testing-library/react';
import { getTestData } from 'test-data';
import React from 'react';
import { TextFieldDropDown } from './TextFieldDropDown';

test('that on focus on input field, the component shows a dropdown', async () => {
    // Set up test data
    const items: any = getTestData();

    // Render component
    const props = { items };
    const { getByRole, queryByRole } = render(<TextFieldDropDown {...props} />, {});
    await wait();

    expect(queryByRole('list')).toBeNull();

    // Fire event
    const placeSelectInputField = getByRole('textbox') as HTMLInputElement;
    fireEvent.focus(placeSelectInputField);

    // Verify that dropdown is shown
    expect(queryByRole('list')).toBeInTheDocument();

});

当我运行测试时,出现以下错误 -TypeError: document.createRange is not a function.

      The above error occurred in the <div> component:
          in div (created by ForwardRef(Portal))
          in ForwardRef(Portal) (created by ForwardRef(Popper))
          in ForwardRef(Popper) (created by TextFieldDropDown)
          in div (created by ForwardRef(ClickAwayListener))
          in ForwardRef(ClickAwayListener) (created by TextFieldDropDown)
          in TextFieldDropDown
          in Provider (created by AllTheProviders)
          in AllTheProviders

      Consider adding an error boundary to your tree to customize error handling behavior.

      The above error occurred in the <ForwardRef(Popper)> component:
          in ForwardRef(Popper) (created by TextFieldDropDown)
          in div (created by ForwardRef(ClickAwayListener))
          in ForwardRef(ClickAwayListener) (created by TextFieldDropDown)
          in TextFieldDropDown
          in Provider (created by AllTheProviders)
          in AllTheProviders

      Consider adding an error boundary to your tree to customize error handling behavior.


  ● that on focus on input field, the component shows a dropdown

    TypeError: document.createRange is not a function

      46 |     // Fire event
      47 |     const TextFieldComponent = getByRole('textbox') as HTMLInputElement;
    > 48 |     fireEvent.focus(TextFieldComponent);
         |               ^
      49 |
      50 |     // Verify that dropdown is shown
      51 |     expect(queryByRole('list')).toBeInTheDocument();

我该如何进行这项工作?


参考这个 github 问题 https://github.com/mui-org/material-ui/issues/15726,我发现我们可以通过将以下代码放入测试设置文件中来修复错误。

  (global as any).document.createRange = () => ({
    setStart: () => {},
    setEnd: () => {},
    commonAncestorContainer: {
      nodeName: 'BODY',
      ownerDocument: document,
    },
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用react-testing-library测试material ui popper时如何修复“TypeError: document.createRange is not a function”错误? 的相关文章

随机推荐

  • CompiledQuery 与 List.Contains (where...in list) 功能?

    我正在尝试使用 Linq to Entities 编写 CompiledQuery 它将替换采用两个数组 在本例中为逗号分隔的 TEXT 参数的存储过程 本质上 SQL 是这样的 Stored Proc definition ArrayPa
  • PHP 到期日期

    背景信息 我正在为游戏 garrys mod 创建一个捐赠 购买系统 当用户通过 paypal 捐赠时 我有 php 代码来处理 iPN 并将数据输入数据库 它还会生成一个序列密钥并将其通过电子邮件发送给用户 然后用户可以在游戏中输入该密钥
  • 玩!无法将 java 列表转换为 scala 列表

    我正在尝试将字符串列表从 java 控制器传递到 scala 模板 这是查看代码 public static Result index List
  • 如何从 JavaScript 通过 TCP 套接字进行通信?

    我正在考虑 AJAX 应用程序必须轮询更新是多么的限制 而 javascript 最好能够建立到服务器的真正的双向连接 我想知道是否有某种方法将 javascript 与浏览器插件集成 可以建立 TCP 连接 以便我可以将数据传入和传出浏览
  • 如果用户在 WPF 中键入任何内容,请检查密码框

    我在用PasswordBox我想检测用户何时输入任何内容 如果是 我需要将按钮状态更改为启用 如何检查用户是否输入任何内容 在里面PasswordBox 它的行为不同于TextBox因为你不能将它绑定到文本 当用户输入任何内容时会引发一些事
  • 是否可以通过 FTP 代理使用 C# FtpWebRequest?

    据我了解 FtpWebRequest Proxy属性表示 HTTP 代理 我必须通过 FTP 代理向外部服务器发出 FTP 请求 到目前为止 我实现此功能的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载 是否可以
  • 如何在 Angular 应用程序中存储身份验证令牌

    我有一个与 REST API 服务器通信的 Angular 应用程序 SPA 我有兴趣找到存储从 API 服务器返回的访问令牌的最佳方法 以便 Angular 客户端可以使用它来验证未来的请求到 API 出于安全原因 我想将其存储为浏览器会
  • 静态转换与动态转换

    假设我有一个充满继承性的 C 库 我得到了一个Base 当我知道它实际上指向一个函数时Derived对象和Derived继承Base 但我不知道它是什么类型的继承 公共 受保护 私有 我也不知道层次结构中是否有虚函数 鉴于这种情况 无需查看
  • 如何找到 Postgres / PostgreSQL 表及其索引的磁盘大小

    我从 Oracle 转到 Postgres 并寻找一种方法来查找表和索引大小 bytes MB GB etc 或者甚至更好的所有表的大小 在 Oracle 中 我有一个令人讨厌的长查询 它查看 user lobs 和 user segmen
  • 多重继承:包含 super() 调用的重写方法

    使用文件 super5 py class A def m self print m of A called class B A def m self print m of B called super m class C A def m s
  • 如何在数据库中存储很旧的日期?

    这实际上不是我遇到的问题 但想象一下有人正在建立一个有关中世纪的网站并想要存储日期 他们会如何做 MySQL 规范DATE说它不会低于 1000 年 当格式为YYYY MM DD 您如何存储有关的信息苏格兰国王肯尼思二世去世 http en
  • Bootstrap 4 无线电验证

    我需要在使用 Bootstrap 4 的页面中使用 Radio 元素进行表单验证方面的一些帮助 我需要在单选元素下方添加错误消息 div class invalid feedback Please choose an option div
  • 如何使用Control.FromHandle?

    我看到一个名为 Control FromHandle 的方法 它 应该 允许您访问它 现在 我想使用这段代码尝试一下 DllImport user32 dll SetLastError true static extern IntPtr F
  • write 函数在 Unix 上需要 unistd.h,那么 Windows 上呢?

    我已经从 Linux 计算机更改为 Windows 但在编译代码时遇到了问题 因为这两个操作系统不共享相同的头文件 由于unistd h没有明显包含在内 Visual C不知道什么read write close socklen t and
  • 当其中一个参数中有空格时,nodeJS child_process.spawn 不起作用

    我正在尝试使用child process spawn功能 语法是 child process spawn command args options 每当我在 args 数组的任何元素中包含空格时 该命令都会简单地发出参数 这是我用来测试它的
  • 适用于多个应用程序的 OWIN 身份验证服务器

    我正在实现一个解决方案 该解决方案具有 MVC 客户端 让我们在 localhost 4077 调用此 CLIENT 和 WebAPI 服务 在 localhost 4078 调用 API 我已经在 API 中实现了 OWIN OAuth
  • Roslyn:如何使用 Roslyn C# 获取声明语法的命名空间

    我有一个包含一些类文件的 C 解决方案 借助 Roslyn 我能够解析解决方案以获取解决方案中的项目列表 从那里 我可以获得每个项目中的文档 然后 我可以获得每个 ClassDeclarationSyntax 的列表 这是起点 foreac
  • Android EditText (TextView) 如何绘制闪烁的光标?

    我正在制作自己的蒙古竖字TextView and EditText 通过扩展从头开始View 我试图了解闪烁光标是如何在Android TextView源代码 https github com android platform framew
  • 从 Stripe 获取 Webhook 异常

    我正在尝试从 Stripe 设置一个 webhook 来处理payment intent succeeded事件 但我得到一个例外 这是我来自 Node 后端的代码 我已经提取了我希望的所有相关部分 如果需要其他任何内容 请告诉我 cons
  • 使用react-testing-library测试material ui popper时如何修复“TypeError: document.createRange is not a function”错误?

    我有一个材料用户界面TextField焦点打开时Popper 我正在尝试使用react testing library 来测试这种行为 成分 import ClickAwayListener from material ui core Cl