如何使用 jest/enzyme 中的“current”属性测试 useRef

2024-03-22

我希望有人能指出我正确的测试方向useRef在下面的组件中。

我有一个类似于下面的组件结构。我正在尝试测试其中的功能otherFunction()但我不确定如何模拟组件引用中的当前属性。以前有人做过这样的事情吗?

const Component = (props) => {
    const thisComponent = useRef(null);
    const otherFunction = ({ current, previousSibling  }) => {
        if (previousSibling) return previousSibling.focus();
        if (!previousSibling && current) return current.focus();
    } 
    const handleFocus = () => {
        const {current} = thisComponent;
        otherFunction(current);
    }
     return (
        <div ref={thisComponent} onFocus={handleFocus}>Stuff In here</div>
    );
};

这是我针对您的案例的测试策略。我用jest.spyOn监视方法React.useRef钩。它可以让我们模拟 SFC 的 ref 对象的不同返回值。

index.tsx:

import React, { RefObject } from 'react';
import { useRef } from 'react';

export const Component = props => {
  const thisComponent: RefObject<HTMLDivElement> = useRef(null);
  const otherFunction = ({ current, previousSibling }) => {
    if (previousSibling) return previousSibling.focus();
    if (!previousSibling && current) return current.focus();
  };
  const handleFocus = () => {
    const { current } = thisComponent;
    const previousSibling = current ? current.previousSibling : null;
    otherFunction({ current, previousSibling });
  };
  return (
    <div ref={thisComponent} onFocus={handleFocus}>
      Stuff In here
    </div>
  );
};

index.spec.tsx:

import React from 'react';
import { Component } from './';
import { shallow } from 'enzyme';

describe('Component', () => {
  const focus = jest.fn();
  beforeEach(() => {
    jest.restoreAllMocks();
    jest.resetAllMocks();
  });
  test('should render correctly', () => {
    const wrapper = shallow(<Component></Component>);
    const div = wrapper.find('div');
    expect(div.text()).toBe('Stuff In here');
  });
  test('should handle click event correctly when previousSibling does not exist', () => {
    const useRefSpy = jest.spyOn(React, 'useRef').mockReturnValueOnce({ current: { focus } });
    const wrapper = shallow(<Component></Component>);
    wrapper.find('div').simulate('focus');
    expect(useRefSpy).toBeCalledTimes(1);
    expect(focus).toBeCalledTimes(1);
  });

  test('should render and handle click event correctly when previousSibling exists', () => {
    const useRefSpy = jest.spyOn(React, 'useRef').mockReturnValueOnce({ current: { previousSibling: { focus } } });
    const wrapper = shallow(<Component></Component>);
    wrapper.find('div').simulate('focus');
    expect(useRefSpy).toBeCalledTimes(1);
    expect(focus).toBeCalledTimes(1);
  });

  test('should render and handle click event correctly when current does not exist', () => {
    const useRefSpy = jest.spyOn(React, 'useRef').mockReturnValueOnce({ current: null });
    const wrapper = shallow(<Component></Component>);
    wrapper.find('div').simulate('focus');
    expect(useRefSpy).toBeCalledTimes(1);
    expect(focus).not.toBeCalled();
  });
});

100%覆盖率的单元测试结果:

 PASS  src/stackoverflow/56739670/index.spec.tsx (6.528s)
  Component
    ✓ should render correctly (10ms)
    ✓ should handle click event correctly when previousSibling does not exist (3ms)
    ✓ should render and handle click event correctly when previousSibling exists (1ms)
    ✓ should render and handle click event correctly when current does not exist (2ms)

-----------|----------|----------|----------|----------|-------------------|
File       |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-----------|----------|----------|----------|----------|-------------------|
All files  |      100 |      100 |      100 |      100 |                   |
 index.tsx |      100 |      100 |      100 |      100 |                   |
-----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        7.689s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56739670 https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56739670

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jest/enzyme 中的“current”属性测试 useRef 的相关文章

  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • React Typescript:从文件输入获取文件

    我得到的错误是Property files does not exist on type ChangeEvent
  • 如何在rails中使用npm包?

    我正在尝试使用王牌编辑 https github com ajaxorg ace在我的 Ruby on Rails 应用程序中 大部分视图由 React 组件组成 我正在使用反应轨道宝石 https github com reactjs r
  • React Map 总是使用最后一个元素的数据调用方法

    我正在制作一个社交媒体应用程序 我正在循环浏览所有评论并将其显示在用户界面上 当我单击编辑时 最后一条评论的文本总是显示在输入中 我尝试了很多不同的方法 改变了结构 使用bind来绑定上下文 但没有任何帮助 我正在使用 React Mate
  • ReactTable 修复了最后一行

    我正在使用 ReactTable 最后我需要创建一些摘要 当分页存在时 它每次都应该可见 可以用react table来实现吗 我可以通过创建下一个表来部分解决这个问题 但我没有找到如何隐藏标题的方法 另一个问题是调整列宽度时 它不会应用于
  • 如何聚焦反应路由器链接

    我有一个用于搜索的输入框 并且希望能够按向下键将焦点从输入移动到列表的第一个s 看来我这里的东西不起作用 因为不是实际的 DOM 节点 我能够使用它来工作 a 代替 though let Link require react router
  • Nextjs 无法在生产环境中的“.next”目录中找到有效的构建

    我正在 docker 中运行我的应用程序 但我的生产构建和启动脚本仅在 docker 环境中失败 虽然node env开发在docker环境下运行良好 这是我的脚本 无法进行生产构建并启动服务器 我正在使用nodemon和babel bui
  • Material UI - 更改主题中的按钮文本颜色

    我在直接在 Material UI 主题中更改按钮文本颜色时遇到问题 更改主色 按钮字体大小效果很好 因此问题不在于传递主题 这是我的代码 import React from react import MuiThemeProvider cr
  • 刷新或直接点击链接时找不到 React.js 页面

    我在此链接上有一个反应项目 https notchy cross 000webhostapp com https notchy cross 000webhostapp com 如果向下滚动 您会看到一个名为 产品类别 的部分 https i
  • React Router v4 的优点

    除了能够在 NavLink 上设置 activeClassName 和 activeStyle 之外 还有什么理由使用NavLink over Link在您的网站上不需要活动状态 类的非导航元素 即不是页眉或页脚中的主导航 上创建指向其他路
  • 是否可以在 React Native 中隐藏“BugReporting extraData”? (使用世博会)

    每次我使用 Expo 打开 React Native 应用程序时 我都会在控制台中收到大量消息 其中包含有关该应用程序的元数据 这实际上对我的调试没有多大帮助 特别是因为它每次都是相同的信息 并且每次应用程序重新加载时都会显示 即使是热重新
  • Jest 和 Babel 转译 - SyntaxError:无法在模块外部使用 import 语句

    在某些情况下 我很难使用 JEST 来运行我得到的测试 测试套件运行失败 node modules p retry index js 1 Object
  • webpack 4 React loadable 不会根据卡盘点分割供应商

    我目前正在使用 webpack 4 和 React loadable 来创建块 它实际上分块取决于断点 然而 供应商规模保持不变 React loadable 还不支持 webpack 4 吗 或者我缺少一些设置 css 实际上似乎被分成了
  • 在 React 中切换 css 类

    如何使用布尔值切换 React 中元素上 css 类的存在 在 Angular 2 中我可以这样做 class red isRed 如何在 React 中做熟悉的事情 在 React 中 元素使用如下语法获取它们的类 div div 但请注
  • 使用 Hooks 从 React Native 中的 Firebase 实时数据库获取的数据未显示在屏幕上

    我最近开始在 React Native 中使用 Hooks 并尝试从 Firebase 实时数据库获取数据并将其呈现在 FlatList 中 数据以对象格式显示在控制台上 但它不起作用 它没有呈现在屏幕上 我究竟做错了什么 我怎样才能让它正
  • 自定义rc-time-picker的样式

    我在用rc time picker我的项目的包 但我在自定义样式时遇到问题pop up of my time picker成分 这是我的组件的屏幕截图 首先 我需要更改时间的背景颜色item在当时li from light grey 在屏幕
  • 由于 apollo-client 未定义,无法解构 GraphQL 查询?

    我正在寻找调试与错误消息相关的问题 未捕获的类型错误 无法解构 0 apollo client WEBPACK IMPORTED MODULE 4 useQuery 因为它未定义 Context 我正在为我的 React js 项目设置后端
  • 如何在故事书中注入窗口变量?

    我想添加一个 React 组件 称为ApplicationForm to a 故事书 https github com storybooks storybook 故事书是这样写的 import configureStore from sto
  • 如何渲染变量(或 prop)内部的 jsx/html?

    const Footer gt let a b Hey b return div Some bold text a div 这只会呈现为Some bold text b Hey b 如何将粗体文本渲染为粗体 变量内容是我自己的 所以我不必担
  • 使用 Vite 和 React 进行生产构建时出错:Uncaught TypeError 中的错误:_ 不是函数

    我在我的网站上使用 Vite React React Router 和 TypeScript 我在运行生产构建时遇到问题 在开发模式下一切正常 使用生产版本时 我的浏览器显示白色背景 并且在浏览器控制台中出现以下错误 上面的链接将我带到第

随机推荐

  • 如何使用 VS2019 解决此 MSB6006 csc.exe 错误 (-2146232797)?

    我刚刚将 VS2019 社区版更新到版本 16 7 2 我的项目开始无法构建 可能是链接步骤 并出现此错误 之前构建得很好 我认为是在 v16 6 something 上 gt Severity Code Description Proje
  • 为jqgrid的每一列添加过滤器

    我有一个jqgrid显示员工的详细信息 我想在每一列中添加一个过滤器 用户可以使用该过滤器输入公司名称 网格显示与网格中的过滤器匹配的所有员工行 谷歌搜索了很多但没有成功 任何参考示例 链接都会有帮助 当您在文本框中键入测试用例的名称时 您
  • 单元格pyqt中的小部件对齐

    我正在 PyQT4 和 Python 2 7 中开发一些工具 但遇到了一个小问题 我有 3 个按钮存储在小部件中 该小部件位于表格 QTableWidget 的单元格中 所以我的问题是我无法将小部件与单元格顶部对齐 并且工具无法将行高调整为
  • 如何遵循 powershell 中的快捷方式

    在 powershell 中 您使用cd dir进入目录dir But if dir是目录的快捷方式 cd dir and cd dir lnk两者都会给出错误 说该目录不存在 那么我该如何遵循这条捷径呢 在Linux中cd dir 正常工
  • 如何爆掉 yeoman index.html 缓存

    当我部署 Angular 应用程序的新版本时 旧版本仍然存在 只是 修复的解决方法是对浏览器进行 硬 刷新 这不是一个可接受的解决方案 我在我的项目中使用 Yeoman 生成器角度 我看了看Gruntfile js并看到它执行了一个在构建期
  • 如何通过 stackexchange api 调用检索 stackoverflow 标签使用计数?

    我想通过 StackExchange API 检索 Ruby 或 Java 等语言的 标签使用计数 基本上我想通过 API 调用检索这些数字 https stackoverflow com tags https stackoverflow
  • 检测是否只给出整数的程序是否进入无限循环

    program to detect whether only integer has been given or not int main int a b s printf Enter two proper number n BEGIN s
  • 如何在 Azure 虚拟机中伪造 OpenGL?

    我想在我的 Azure VM Windows Server 2008 中运行一些需要 OpenGL 2 0 的程序 然而 虚拟机没有视频硬件 我如何才能让程序相信我有足够好的视频卡 如果我没有虚拟显卡 我该如何在云中进行所有开发呢 您可以放
  • Mongo / Mongoose 聚合 - $redact 和 $cond 问题

    我很幸运能够得到另一个SO问题的精彩答案Mongo Mongoose 按日期聚合 https stackoverflow com questions 43864813 mongo mongoose aggregating by date来自
  • 静态多态性定义和实现[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对这个概念有一些疑问静态多态性我有时听说 您可能主要在 C 上下文中解释它们 但我希望在适用的情况下提供与语言无关的答案 因此标记
  • 新的空 iOS 应用程序存在数十处内存泄漏

    在一款新的 从头开始的单视图 iOS 应用程序上使用 Leaks Instruments 工具报告了 23 起泄漏 这似乎不对 我错过了什么吗 重复运行会产生不同的泄漏计数 从 16 到 35 重现步骤遵循此屏幕截图 类似的未回答的问题发布
  • 绘制一个矩形 google.maps.Polygon 给定其中心点和尺寸

    我正在编写一个 PHP 脚本 它接受 XML 输入 解析它 然后显示 最终旋转 矩形和椭圆区域 因为区域可以旋转 所以我必须使用google maps Polygon并不是Rectangle 为了处理旋转我希望使用谷歌地图多边形旋转 htt
  • 如何以编程方式从 spring-boot-actuator 获取指标?

    我们在生产中有一个弹簧应用程序 它不是 Spring boot 我发现这个帖子 https stackoverflow com questions 26913087 use spring boot actuator without a sp
  • 我可以在 Node 中执行字符串命令吗?

    如果我构造一个存储在字符串变量中的函数或命令列表 有没有办法可以在节点中执行它们并保留另一个变量中返回的内容 IE var result executeMyCoolStringCommands myStringVariableWithCom
  • Phonegap数据库问题-在数据库中存储图像

    我正在尝试使用以下选项制作一个非常基本的库存应用程序 添加库存中物品的照片 我已拥有一切 除了照片部分外正在工作 我看过这个 http phonegap pbworks com iPhone 3A Camera API http phone
  • 如何让Gedit看起来像Textmate?

    我想让 Gedit 看起来像 Textmate 并且行为也像它 我在网上阅读了很多教程 但找不到易于遵循的指南 我正在使用 Ubuntu 11 04 并希望将其用于 Ruby on Rails 和其他网络语言 我只想要核心功能 例如类 项目
  • 如何从 Docker 控制 fluidd 日志标签

    当前设置正在运行 Docker 容器fluentd driver docker run log driver fluentd my container 这工作起来很容易 将标准输出发送到主机上本地运行的 Fluentd 系统 我想控制流利t
  • MapStruct - @Mapper 注释不创建 bean

    我从此来源下载了应用程序https github com springframeworkguru spring5 mvc rest tree vendor api https github com springframeworkguru s
  • Bootstrap 5 有内置水平线吗?

    我正在寻找样式或彩色水平线 最好有成功 主要 警告类别 类似的概念彩色链接 https getbootstrap com docs 5 0 helpers colored links 我在 Bootstrap 的网站上找不到这个主题 我找到
  • 如何使用 jest/enzyme 中的“current”属性测试 useRef

    我希望有人能指出我正确的测试方向useRef在下面的组件中 我有一个类似于下面的组件结构 我正在尝试测试其中的功能otherFunction 但我不确定如何模拟组件引用中的当前属性 以前有人做过这样的事情吗 const Component