首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Jest/Enzyme覆盖自定义钩子中的回调参数

基础概念

Jest 是一个流行的 JavaScript 测试框架,用于编写单元测试、集成测试和端到端测试。Enzyme 是一个用于测试 React 组件的库,它提供了浅渲染(shallow rendering)、静态渲染(static rendering)和全量渲染(full DOM rendering)的功能。

自定义钩子(Custom Hooks)是 React 中的一个功能,允许你在函数组件之间复用状态逻辑。自定义钩子通常返回一些值和一个或多个回调函数,这些回调函数可以在组件中被调用来更新状态。

相关优势

  • Jest:易于设置和使用,支持模拟(mocking),提供了丰富的断言库,可以与多种测试工具集成。
  • Enzyme:专门为 React 应用设计,提供了方便的 API 来测试组件的渲染输出和行为。
  • 自定义钩子:提高了代码的可复用性和可维护性,使得组件逻辑更加清晰。

类型

  • 单元测试:测试单个函数或方法的行为。
  • 集成测试:测试多个组件或模块之间的交互。
  • 端到端测试:模拟用户操作,测试整个应用流程。

应用场景

当你需要测试自定义钩子中的回调参数时,通常是因为这些回调函数会影响组件的状态或行为。例如,你可能有一个自定义钩子用于处理表单提交,你需要确保回调函数在特定条件下被正确调用。

问题与解决方案

假设你有一个自定义钩子 useForm,它接受一个回调函数作为参数,并在表单提交时调用这个回调函数。

代码语言:txt
复制
// useForm.js
import { useState } from 'react';

const useForm = (callback) => {
  const [values, setValues] = useState({});

  const handleSubmit = (event) => {
    event.preventDefault();
    callback(values);
  };

  return {
    values,
    setValues,
    handleSubmit,
  };
};

export default useForm;

你可以使用 Jest 和 Enzyme 来测试这个自定义钩子中的回调参数。

代码语言:txt
复制
// useForm.test.js
import React from 'react';
import { shallow } from 'enzyme';
import useForm from './useForm';

describe('useForm', () => {
  it('should call the callback with the form values on submit', () => {
    const mockCallback = jest.fn();
    const wrapper = shallow(<YourComponent callback={mockCallback} />);

    // 模拟表单提交
    wrapper.find('form').simulate('submit', { preventDefault: () => {} });

    // 断言回调函数被调用,并且传入了正确的参数
    expect(mockCallback).toHaveBeenCalledWith(wrapper.find('YourComponent').prop('values'));
  });
});

在这个例子中,YourComponent 是一个使用 useForm 钩子的组件。我们使用 Jest 的 mockFn 来创建一个模拟的回调函数,并使用 Enzyme 的 shallow 方法来渲染组件。然后,我们模拟表单提交事件,并断言回调函数被正确调用。

参考链接

通过这种方式,你可以确保自定义钩子中的回调参数在各种情况下都能按预期工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

那些年错过React组件单元测试(上)

技术方案 针对项目本身使用是React + Dva + Antd技术栈,单元测试我们Jest + Enzyme结合方式。...通过第一个测试用例加 1,number值为 1,当第二个例减 1 时候,结果应该是 0。但是这样两个例间相互干扰不好,可以通过 Jest 钩子函数来解决。...jest提供了三种方案来测试异步代码,下面我们分别来看一下。 done 关键字 当我们test函数中出现了异步函数时,可以给test函数传入一个done参数,它是一个函数类型参数。...我们给test函数传入了done参数,在fetchData函数调用了done。...这样,fetchData异步执行测试代码就能够被执行。

5K20

IT文档总出现hooks 是什么? 钩子 ? ?

引用知乎上著名示意图 ? 简单理解 就像一些外来钩子,在源代码之间钩取一些信息,当捕捉到感兴趣事时,就拦截下来,让自己代码执行一下,处理一下这个信息,然后再放出去继续之前进程。...这样就可以在不用改变源代码情况下,做一些别的事情,比方说监控、分析和一些恶意事 专业理解 在计算机编程,术语“钩子”涵盖了一系列技术,这些技术通过截获在软件组件之间传递函数调用或消息或事件来更改或增强操作系统...这个东西在各个语言/框架具体形式也不同,就比如 Java Listener 基本就指回(但也可能是 Listener 本意,容易混淆),只是因为 Java 里用于构造接口叫 xxxListener...至于总经理怎么hook操作:是随便签字,还是搞潜规则,或者有自己想法和安排来进行新采购事项,这就属于hook具体实现 这个东西在各个语言/框架具体形式也不同,就比如 Java Listener...基本就指回(但也可能是 Listener 本意,容易混淆),只是因为 Java 里用于构造接口叫 xxxListener。

1.4K41
  • 利用 kotlin 方式自定义事件(kotlin函数参数)

    java 自定义事件写法 创建 interface类,创建 interface 对象,实现 set 方法: ? 使用: ?...kotlin 自定义点击事件写法 依照 java 思想(不推荐) 创建 interface类,创建 interface 可变对象(var) ? 使用: ?...利用 kotlin 函数作为参数(强烈推荐) 来看一下系统点击事件在 kotlin 是什么样: ? 是不是简直简洁到不像话?...再看看你自己定义点击事件,感觉跟还在用 java 开发一样… 下面就来看个新写法: 创建一个函数对象,在需要回地方调起这个函数: ? 用法: ? 是不是比对象表达式看起来还要简洁?...这里再说点个人经验,如果你方法不止一个的话,推荐还是声明 interface 来做,这样的话都在一个 interface 里边好管理一些 以上这篇利用 kotlin 方式自定义事件(kotlin

    1.8K21

    干货 | 携程租车React Native单元测试实践

    一、技术选型: Jest + Enzyme + react-hooks-testing-library 1.1 jest Jest是FaceBook出品前端测试框架,适合用于React和React...1.2 Enzyme Enzyme是AirBnb开源React测试工具库,通过一套简洁api,可以渲染一个或多个组件,查找元素,模拟元素交互(如点击,触摸),通过和Jest相互配合可以提供完整...比如之前提到初始化文件jest.setup.js,我们会mock一些对象: jest.useFakeTimers(); //mock时间 jest.mock('....husky做代码提交检查 Jest集成了Istanbul这个代码覆盖工具并会生成详细报告,执行jest --coverage即可生成基于四个维度覆盖率报告: ?...语句覆盖率(statement) 分支覆盖率(branches) 函数覆盖率(functions) 行覆盖率(lines) 同时我们会配置husky在commit或者push之前添加钩子,在这些动作之前强制执行单元测试

    6.1K30

    开源库架构实战——从0到1搭建属于你自己开源库

    移除事件时需要传递指针,怎么让用户调和我们绑定在元素上事件形成映射? ​...在自定义事件,我们是通过同时监听 touchstart 和 touchend 两个事件来判断用户触发事件类型,并且在指定位置执行用户传入。...那么,当用户需要移除之前绑定事件时,我们又该如何处理呢?用户传入肯定是需要执行,而不是我们绑定在元素上事件。 ​...这时候,我们就需要对用户传入执行调和我们绑定在事件监听上建立映射关系了,这样我们就可以依据用户传入执行找到我们所需要移除事件绑定函数了。...来进行移除事件绑定,自定义事件也是同理。

    1.3K20

    Jest:给你 React 项目加上单元测试

    单元测试(Unit Testing),指的是对程序模块(最小单位)进行检查和验证。比如一个函数、一个类、一个组件,它们都是模块。 使用单元测试优点: 更好地交付高质量代码。...我们不愿意去重构代码,不去还技术债,很大原因是测试覆盖率不足,害怕遗漏一些边边角角逻辑,导致线上发生重大事故; 可以测试描述模块功能。...function sum(a, b) { return a + b; } export default sum; 然后我们 Jest 来做测试。 import sum from '....test 方法创建了一个测试作用域,该方法有三个参数: 测试描述。 我们写测试代码函数。 测试超时时间,默认为 5 秒,有些测试是异步,我们需要等待。...('请求测试', async () => { const res = await getData(); expect(res.data.success).toBe(true); }) 也支持函数风格测试

    2.9K20

    前端自动化测试

    前言 本文主要是介绍基于React+Ant Design(以下Antd表示Ant Design)项目,在对于自己封装,或者基于Antd封装公共组件自动化测试技术选型和实践。...操作变得十分友好 综合目前市面上轮子,我们技术选型为Jest+Enzyme 实践 例子是一个基于Antd二次封装单选年日期选择器,如下演示: 图片 代码结构如下 图片 其中测试相关文件,...这里可以首先简单看一下,Jest+Enzyme基本语法: JestAPI更多着力于定义测试、断言、mock库 定义测试: describe: 定义一个测试套件(test suite) it: 定义一个测试...(test) beforeEach: 定义一个函数在每个测试之前执行 expect: 执行一个断言 jest.fn(): 创造一个mock函数 一些用于断言方法: toEqual: 验证两个值是否相同...: 验证一个mock函数是否被调用 toBeCalledWith: 验证一个mock函数是否被传入指定参数被调用 一些用于mock方法: mockImplementation: 提供mock函数执行

    2K20

    Sentry 开发者贡献指南 - 前端(ReactJS生态)

    https://github.com/getsentry/sentry/blob/master/static/app/sentryTypes.tsx 事件处理程序 我们使用不同前缀来更好地区分事件处理程序和事件属性...对事件处理程序使用 handle 前缀,例如: 对于传递给组件事件属性,请使用 on 前缀,例如: <Button onClick...测试未定义 theme 属性 而不是使用来自 enzyme mount() ...使用这个:import {mountWithTheme} from 'sentry-test/enzyme' 以便被测组件...使用多个 useEffect 表示您有一个高度有状态组件, 您应该使用类(class)组件来代替。...我们通常赞成覆盖而不是代码覆盖。 查询 尽可能使用 getBy... 仅在检查不存在时使用 queryBy...

    6.9K30

    【译】使用Enzyme和React Testing Library测试React Hooks

    如果你第一次使用Enzyme,我们之前发布过关于它文章,《Enzyme如何在React应用Jest一起使用》。我们可以用他们来深入测试React Hooks。...npm install --save-dev enzyme enzyme-adapter-16 在src目录,创建一个名为setupTests.js文件。...Test 2:我们可以添加一个新待办事项 我们还可以使用getTestById返回与我们传入参数匹配节点。...为了模拟添加新待办项单击事件,我们使用fireEvent.click()方法并传入getByText()方法,该方法返回是文本与我们传参数匹配节点。...加油写面向对象React代码! React钩子和应用其他钩子一样容易出错,你要确保你能很好地使用它们。正如我们刚才看到,有几种方法可以做到这一点。

    4.1K30

    对 React 组件进行单元测试

    、传入什么参数、返回什么结果,甚至是抛出异常情况。...实际使用,适当自定义配置一下,会得到更适合我们测试场景: //jest.config.jsmodule.exports = { modulePaths: [ "<rootDir...一般使用 Enzyme mount 或 shallow 方法,将目标组件转化为一个 ReactWrapper对象,并在测试调用其各种方法: import Enzyme,{ mount } from...再次运行测试;如果能成功则跳到步骤5,否则重复步骤3 重构已经通过测试代码,使其更可读、更易维护,且不影响通过测试 重复步骤1 解读测试覆盖率 这就是 jest 内置 istanbul 输出覆盖率结果...('应该在输入时触发回', function(done) { var spy = jest.fn(); var wrapper = mount( <Comp onChange=

    4.3K40

    JavaScript 测试系列实战(三):使用 Mock 模拟模块并处理组件交互

    在之前两篇教程,我们学会了如何去测试最简单 React 组件。在实际开发,我们组件经常需要从外部 API 获取数据,并且组件交互逻辑也往往更复杂。...在这篇教程,我们将学习如何测试更复杂组件,包括 Mock 去编写涉及外部 API 测试,以及通过 Enzyme 来轻松模拟组件交互 初次尝试 Jest Mock 我们应用程序通常需要从外部...React 组件交互 在上面迭代 TodoList ,我们使用了 axios.post。...它第一个参数是事件类型(由于我们在输入中使用onChange,因此我们应该在此处使用change),第二个参数是模拟事件对象(event)。...不幸是,测试钩子并没有那么简单。在本文中,我们研究了如何使用 react-hooks-testing-library[2] 处理它。

    4.8K20

    写代码无BUG,网易云前端单元测试方案总结

    所以我们可以直接 Node 自带 assert 模块做断言。...enzyme Enzyme基础配置如下: npm install enzyme enzyme-adapter-react-16 jest-enzyme jest-environment-enzyme jest-canvas-mock...此外 Enzyme 还注册了许多友好断言函数到 Jest ,如下所示,参考地址[8] toBeChecked() toBeDisabled() toBeEmptyRender() toExist()...总结 如果让我推荐的话,对于真实浏览器我会推荐 Karma + Jasmine 方案测试,对于 React 测试 Jest + Enzyme 在 JSDOM 环境下已经能覆盖大部分场景。...另外测试 React组件除了 Enzyme 提供操作, Jest 还有很多其他有用特性,比如可以 mock 一个 npm 组件实现,调整 setTimeout 时钟等,真正进行单元测试时,这些工具也是必不可少

    9.6K20

    前端接入单元测试(Node+React)

    意义假如要重构一个老前端框架,并根据其开发一个向后兼容新框架。此时老框架针对其内部API函数,写了充分单侧例。...在开发新框架时,直接运行老前端框架单侧例,如果所有测试用例都通过,则可快速保证内部api一致性,快速验证所有功能。...KarmaKarma 能在真实浏览器测试,强大适配器,可配置其他单测框架,一般会配合 Mocha 或 Jasmine 等一起使用。每个框架都有自己优缺点,没有最好框架,只有最适合框架。.../src/fetch.js'test('fetchPostsList函数应该能够被调用', async () => { expect.assertions(1); let mockFn =...语句覆盖率,它其实对应就是js语法上语句,js解析成ast数类型为 statement 。

    3.3K30

    万字详文:彻底搞懂 Jest 单元测试框架

    test 它需要两个参数:一个用于描述测试块字符串,以及一个用于包装实际测试函数。expect 包装目标函数,并结合匹配器 toBe 用于检查函数计算结果是否符合预期。...如何实现测试块 测试块其实并不复杂,最简单实现不过如下,我们需要把测试包装实际测试函数存起来,所以封装一个 dispatch 方法接收命令类型和函数: const test = (name,...模拟 在复杂测试场景,我们一定绕不开一个 Jest 术语:模拟(mock) 在 Jest 文档,我们可以找到 Jest 对模拟有以下描述:”模拟函数通过抹去函数实际实现、捕获对函数调用,以及在这些调用传递参数...V8 虚拟机执行完毕之后,全局 state 就会收集到测试块中所有包装好测试函数,我们最后只需要把所有的这些函数遍历取出来,并执行。...在上面的基础架构上增加钩子函数,其实就是在执行 test 每个过程中注入对应函数,比如 beforeEach 就是放在 testBlock 遍历执行测试函数前,afterEach 就是放在 testBlock

    7.8K20

    Jest来给React完成一次妙不可言~单元测试

    (自测,简单走下主流程)•各种类型整体代码覆盖率要大于50%。•小型测试覆盖率要大于10%。 •级别3 •所有重要代码变更都要经过测试。•小型测试覆盖率大于50%。...官方文档在这里[6],如果要指定的话,如下值是对官方文档简单摘录: •container:React Testing库将创建一个div并将该div附加到文档。而通过这个参数,可以自定义容器。...除非合并,否则将覆盖DOM测试库默认设置。 基本上,这个函数所做就是使用ReactDOM呈现组件。在直接附加到document.body新创建div呈现(或为服务器端呈现提供水合物)。...测试当我们点击链接时,它是否参数导航到其他页面: 现在,要检查导航是否工作,我们必须触发导航链接上单击事件。...对于第一个测试,我们检查内容是否等于About页面文本,对于第二个测试,我们测试路由参数并检查它是否正确通过。 现在我们可以进入最后一节,学习如何测试Axios请求。 8.

    14.9K33

    如何自动化测试 React Native 项目 (下篇) - 单元测试

    单元测试工具 - Jest & Enzyme Jest - Facebook Jest 是 Facebook 开源 Javascript 测试框架,提供了许多好用 API,先介绍下主要优点: 自带...(在 vuejs 测试可以 vue-test-utils) Enzyme 提供了可以直接操作 React component props 和s tate 方法,使得建造测试 context...需要渲染更深层次子组件时也可以 enzyme 提供dive方法来实现。...实际应用时,我们用了 jest shallow 方法来生成测试组件wrapper; enzyme-to-json/serializer 这个 lib 把生成 shallowWrapper 转化成...我们测试脚本可以这么写: // Mock Logger module方法, jest.fn来实现spy方法 Logger.log = jest.fn(); // setup shallowWrapper

    3.3K21

    Unit Testing

    "test": "jest" } } 之后只需要在 Command Line 输入 yarn test 即可开启测试 #配置时遇到麻烦 在我配置 Jest 时遇到了几个麻烦,让我测试代码运行不起来...'] } /__mocks__/enzymeMock.js 文件代码 import Enzyme from 'enzyme' import Adapter from 'enzyme-adapter-react...那么一定是你出了问题 快速回归 -> 当我们在开发业务时候,例如在原有功能上添加新功能,那么新开发功能不会影响之前业务逻辑,如果测试代码出了问题,那么一定是你问题 #测试覆盖率 在真实项目开发当中...但是如果你将所有的代码都写了单元测试,那么我觉得你是把全身安全带都绑上了,只露了一只眼睛,你开发工作将举步难行,下面来说说单元测试应该覆盖哪些,不应该覆盖哪些 组件类型/测试内容 分支渲染逻辑 事件调用...在表格,建议是在 100% 覆盖率 #参考 Jest React 测试技巧 React 单元测试策略及落地 单元测试-维基百科

    1.3K20

    JavaScript测试教程-part 2:引入 Enzyme 并测试 React 组件

    JavaScript测试教程-part 1: Jest 进行单元测试 2. JavaScript测试教程–part 2:引入 Enzyme 并测试 React 组件 3....Enzyme 基础 Enzyme 是一个库,用于在测试时处理你 React 组件。它由 Airbnb 开发。 设置 Enzyme 继续上一篇文章内容,假设你 Jest 已经能够工作了。...这里要注意一个非常重要点:即使我们用了 Enzyme,但测试运行程序仍然是 Jest。由于我们是 expect 函数,因此可以使用各种可供调用匹配器函数。我已经在课程第一部分中提到了它们。...在第一个测试,我们使用了 toContainReact 函数,这是一个自定义匹配器函数。它是 enzyme-matchers 库一部分。...要将其与 Jest 一起使用,请安装 jest-enzyme 包。 1npm install jest-enzyme 最后要做是将其导入 setupTests 文件

    1.4K50

    jest 单元测试改善老旧 Backbone.js 项目

    根据目标项目的情况采用了 enzyme-adapter-react-13 做适配 cross-env 设置环境变量 test,从而配置出适用于 jest .babelrc 文件,且不影响生产环境...另一个难点在于,Backbone.View constructor / initialize “构造函数”,并不能接受自定义 props 参数。...$el.find('.multi').length).toEqual(0); }); 对方法调用测试 自然还是 sinon 来做: it('应正确响应事件并加载子模板', function()...总结 jest 灵活配置能力,使其能方便应用于各种类型既有项目的 TDD 开发和重构 之前其他测试框架下例,可以快速迁移到 jest Backbone.View 视图组件在经过 ES6 升级和合理封装后...组件引入模板,也可以 jest.doMock() 很好支持 将单元测试任务加入原有的 build 工作流,可以保证相关代码之后持续有效 (end)

    3.5K10
    领券