Jest/React 模拟滚动和 .getBoundingClientRect 函数

2024-01-08

我有一个函数handleClick,它在一个元素上使用scrollBy,该元素使用getBoundingClientRect 获取其第一个参数。我正在尝试使用笑话/酶来测试这一点。

class myClass extends Component  {
    ...
    ...
    handleClick () {
        document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
    }

    render() {
        return (
            <button className="my-button" onClick={this.handleClick()}>scroll</button>
        );
    }
}

My test:

it('calls scrollBy with correct params', () => {
    const props = {};
    myClassWrapper = mount(<myClass {...props} />);
    const scrollBySpy = jest.fn();
    global.document.getElementById = jest.fn(() => ({ scrollBy: scrollBySpy }));

    myClassWrapper.find('my-button').simulate('click');
    // expect(scrollBySpy).toHaveBeenCalledWith()
});

我正在尝试测试使用正确的参数调用scrollBy,但是在运行此测试时出现以下错误:

Error: Uncaught [TypeError: document.getElementById(...).getBoundingClientRect is not a function] 

抱歉,如果之前已经回答过这个问题,但我看不到任何可以回答我的情况的内容。先感谢您。


scrollBy在第一个结果上调用getElementById, and getBoundingClientRect调用第二个结果getElementById因此,您需要在模拟中返回的对象上包含这两个函数。

这是一个帮助您入门的工作示例:

import * as React from 'react';
import { mount } from 'enzyme';

class MyClass extends React.Component {
  handleClick() {
    document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
  }

  render() {
    return (
      <button className="my-button" onClick={this.handleClick}>scroll</button>
    );
  }
}

it('calls scrollBy with correct params', () => {
  const props = {};
  const myClassWrapper = mount(<MyClass {...props} />);
  const scrollBySpy = jest.fn();
  const getBoundingClientRectSpy = jest.fn(() => ({ width: 100 }));
  global.document.getElementById = jest.fn(() => ({
    scrollBy: scrollBySpy,
    getBoundingClientRect: getBoundingClientRectSpy  // <= add getBoundingClientRect
  }));

  myClassWrapper.find('.my-button').simulate('click');
  expect(scrollBySpy).toHaveBeenCalledWith(100, 0);  // Success!
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jest/React 模拟滚动和 .getBoundingClientRect 函数 的相关文章

随机推荐

  • 预加载取决于 Ruby on Rails 中的关联类型

    我有一个多态关联 belongs to resource polymorphic true where resource可以是多种不同的型号 为了简化问题 假设它可以是Order or a Customer 如果它是一个Order我想预加载
  • 安装pbr时出错

    我想在运行 OSX 10 8 5 的计算机上安装 openstack 客户端 作为先决条件 我需要安装 pbr 所以 我做了以下事情 git clone git github com openstack dev pbr git cd pbr
  • 对具有多个条件的元组列表进行排序

    我有一个包含 k 个元素的元组列表 我想先对元素 0 进行排序 然后对元素 1 进行排序 依此类推 我用谷歌搜索 但我仍然不太清楚该怎么做 会是这样的吗 list sort key lambda x x 0 x 1 x k 1 特别是 我想
  • 是否可以在 iPhone 应用程序图标中使用透明度?

    我为我的应用程序创建了一个 57 57 圆形图标 无光泽 其圆外具有透明度 我可以在模拟器和 iPhone 上成功安装该应用程序 它工作得很好 而且看起来很棒 但是 我可以向 Apple 提交透明的图标吗 他们会接受吗 我找不到任何图标具有
  • Cocos2d-x - 如何将CCLayer的一部分设置为透明?

    我是新手cocos2d x我需要你的帮助 我需要使图层的触摸部分透明 如何使图层的一部分透明 我曾想过使用 ClippingNode 但我找不到示例或文档 我使用C 谢谢 在所有cocos2d x版本中添加的TestCpp项目中 您可以找到
  • java 清单类路径与-classpath

    我试图找出可执行 jar 文件的一个奇怪问题 xyz jar 在清单文件 中有一个类路径 并且依赖于 abc jar 库 不幸的是 xyz jar 中的清单类路径不正确 为了避免灾难 我正在更新执行命令以使用 java classpath
  • 为什么 this.evaluate 不能正确返回 DOM 节点?

    我试图通过以下方式从网页获取对象evaluate 方法 这样我就可以在范围之外使用它evaluate 使用名称选择的元素symbol is a
  • “不存在”和“不存在”有什么区别?

    有什么区别not in and not exists在 Oracle 查询中 我什么时候使用not in And not exist 和 之间的不同NOT IN and 不存在变得清楚哪里有NULL结果中包含的值 例如 create tab
  • 使用硬件加速的自定义 Android 视图中的部分失效

    我的应用程序中有一个自定义视图 它填充了整个活动 在大多数情况下 当我想刷新控件时我调用invalidate 没有任何参数 但是 在某些情况下 我只更改控件的一小部分区域 我会调用invalidate Rect 以避免重绘整个屏幕 这很重要
  • 向 JTable 和数据库 (phpMyAdmin) 添加一行?

    initComponents try ResultSet res statement executeQuery SELECT FROM banh ResultSetMetaData RSMD res getMetaData NumberOf
  • 如何在 Xamarin.Forms 中删除(Android)应用程序标题栏?

    我是否可以在 Xamarin Forms 中删除应用程序的标题栏 我正在开发 Xamarin Forms Portable 项目 我尝试了很多解决方案 但都不起作用 我什至无法启动应用程序 第一次尝试我尝试将其添加到我的 AndroidMa
  • TypeScript:为同一项目中的不同文件声明不同的库/引用

    我有一个用 TypeScript 编写的项目 我同时使用 dom 和 Web Workers 因此我在某些文件中需要 webworker d ts 库 在其他文件中需要 dom d ts 我已经尝试将 webworker 添加到 tscon
  • Dynamo DB 中的自动递增计数器

    我正在尝试在 dynamo 数据库中实现哈希键的自动递增计数器 但我的代码对于并发事务失败 任何帮助实现该功能的帮助将不胜感激 我是堆栈溢出的新手 可能无法正确指定它 任何实施都会有所帮助 您有两种选择 使用 dynamo db 原子计数器
  • YAML 媒体类型?

    通过 HTTP 发送使用 YAML 构建的数据时最合适的媒体类型 正式的 MIME 类型 是什么 为什么 没有已注册的应用类型 http www iana org assignments media types application or
  • 为什么在单独的模型文件中使用 model.export ?

    在查看一些有关拆分模型数据的 Stackoverflow 答案时 我看到了两种不同的格式 见下文 var UserSchema mongoose Schema name String module exports mongoose mode
  • Java 是否可以在运行时实现接口?

    我正在开发一个项目 其中有很多由库创建的对象 并且我无法访问这些对象的创建过程 以下片段是说明我的问题的一个很好的例子 Code public class Clazz The contents of Clazz are irrelevant
  • Haskell:在 WinGHCi 中卸载模块

    我加载了两个模块 NecessaryModule1 hs 和 NecessaryModule2 hs 中的链接 Haskell 加载当前目录路径中的所有文件 https stackoverflow com questions 1026869
  • 用于多个文件上传验证的 jQuery Validate 插件

    我有一个文件上传字段 可以选择和上传多个文件 我正在使用 jquery Validate 插件进行字段验证 对于单个文件上传 我可以成功利用此插件功能 但我不知道如何将其与多个文件一起使用文件上传归档 这是我的html
  • CarrierWave 并将大小调整为特定宽度

    在 Rails 3 0 中使用 CarrierWave 您将如何编写代码 将宽度大于 500 像素的图像调整为 500 像素宽 并适当调整高度 保持相同的初始宽高比 您可以使用 process resize to limit gt 500
  • Jest/React 模拟滚动和 .getBoundingClientRect 函数

    我有一个函数handleClick 它在一个元素上使用scrollBy 该元素使用getBoundingClientRect 获取其第一个参数 我正在尝试使用笑话 酶来测试这一点 class myClass extends Componen