Vue3+Typescript+Vitest单元测试环境+组件事件测试篇

news2024/11/15 15:26:12

上一节我们学会了组件测试的基础测试部分组件测试基础篇,这一节,我们学习一下深入测试组件的事件

在component中增加一个新的组件,名字就叫做Zmbutton2吧

import { defineComponent } from "vue";

const ZmButton2 = defineComponent({
  name: "ZmButton2",
  setup() {
    const clickHandler = (e: Event) => {
      console.log("当前组件的点击事件参数是:", e);
    };
    return () => <button onClick={clickHandler}>测试事件</button>;
  },
});
export default ZmButton2;

在对应的测试文件中新增测试代码如下,先断言这个组件的正确渲染,看代码行数旁边的图标,是测试通过的,这个是vscdoe的插件,vitest,第一章说过的
在这里插入图片描述

现在让我们增加一个测试项,来测试一下这个点击事件是否正常工作

在这里插入图片描述
运行测试代码,可以发现控制台能输出这个点击事件的打印信息,说明这个点击事件被调用了,当然我们这里并没有进行断言,所以这个例子只能证明点击事件是工作的,而不能证明它有什么用,我们还需要改造一下点击事件的内部逻辑,让它和标准组件那样暴露出一个emit来,然后我们去测试这个emit就能证明这个事件系统的作用了
在这里插入图片描述

接着我们改写一下ZmButton2的组件设计

现在我们让组件内部暴露了一个emit事件,那么在外面我们就能断言这个事件是否被调用,从而简介测试了组件内部的某些事件是否正常工作

import { defineComponent } from "vue";

const ZmButton2 = defineComponent({
  name: "ZmButton2",
  emits: ["click"],
  setup(props, { emit }) {
    const clickHandler = (e: Event) => {
      emit("click", e);
    };
    return () => <button onClick={clickHandler}>测试事件</button>;
  },
});
export default ZmButton2;

现在增加一个测试项,用来测试事件emit

看注释内容,这里需要掌握一些前置知识,其中vi.fn是vitest内置的一个工具,具体解释如下,我的理解是这个是函数的包装,
在这里插入图片描述
在这里插入图片描述
接着我们运行测试代码,查看测试结果,可以发现断言通过,并且控制台输出了wrapper包装器包含一个click事件源头
在这里插入图片描述

当然我们也可以写更多的事件去触发一下,查看一下控制台的输出情况,例如我们弄一个输入框组件来测试更多的事件例子,新增一个输入框组件

import { defineComponent } from "vue";

const ZmInput = defineComponent({
  name: "ZmInput",
  emits: ["focus", "blur", "change", "input"],
  setup(props, { emit }) {
    // 聚焦事件
    const focusHandler = () => {
      emit("focus");
    };
    // 失去焦点事件
    const blurHandler = () => {
      emit("blur");
    };
    // change事件
    const changeHandler = () => {
      emit("change");
    };
    // 输入事件
    const inputHandler = () => {
      emit("input");
    };
    return () => (
      <input
        placeholder="请输入"
        onChange={changeHandler}
        onFocus={focusHandler}
        onBlur={blurHandler}
        onInput={inputHandler}
      />
    );
  },
});

export default ZmInput;

在对应组件的测试文件中写入一下内容测试这些事件测试

import { mount } from "@vue/test-utils";
import { describe, expect, it, vi } from "vitest";
import ZmInput from "../input";
import { nextTick } from "vue";

describe("input", () => {
  // 按照惯例测试是否正常渲染
  it("render", () => {
    const wrapper = mount(() => <ZmInput />);
    expect(wrapper.exists()).toBeTruthy();
  });

  // 接着一口气测试所有的事件源头,正常的测试应该是单一的,一个一个单独事件测试,但是这里演示就一起写了
  it("events test", async () => {
    const focusHandler = () => {
      console.log("got focus");
    };
    const changeHandler = () => {
      console.log("change");
    };
    const blurHandler = () => {
      console.log("blur");
    };
    const inputHandler = () => {
      console.log("inputHandler");
    };
    const wrapper = mount(() => (
      <ZmInput
        onBlur={blurHandler}
        onChange={changeHandler}
        onFocus={focusHandler}
        onInput={inputHandler}
      />
    ));
    // 先聚焦
    wrapper.trigger("focus");
    // 失去焦点
    wrapper.trigger("blur");
    // 触发change事件
    wrapper.trigger("change");
    // 触发input事件,这种事件也可以被value值改变时触发
    wrapper.trigger("input");
    await nextTick();
    expect(focusHandler).toHaveBeenCalled;
    expect(changeHandler).toHaveBeenCalled;
    expect(blurHandler).toHaveBeenCalled;
    expect(inputHandler).toHaveBeenCalled;
  });
});

最后执行一下测试代码,如果写了很多测试代码,只想测试某个文件怎么办呢?答案是利用过滤测试,在命令后面跟一个文件的名字即可,官网也有说明
在这里插入图片描述
测试运行结果如下,我的文件名字叫做input.test.tsx
在这里插入图片描述

好了这一章我们就学会了如何测试组件的事件,单纯测试事件并没有什么用处,这个应该结合Vue的双向绑定或者prop才有意义,那么下一章我们就测试一下prop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Spring MVC》 第一章 MVC模式

前言 MVC 模式&#xff0c;全称为 Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式。是一种软件架构模式。 分层描述Model&#xff08;模型&#xff09;它是应用程序的主体部分&#xff0c;主要由以下 2 部分组成&#xff1a; 实体类 Bean&#xff1a;专…

(4.7-4.13)【大数据新闻速递】上海、广州、青海、贵阳大力发展大数据产业;2026年中国大数据市场规模预计达365亿美元

01【贵阳大数据交易所发布全国首个交易激励计划】 4月6日&#xff0c;贵阳大数据交易所发布了“交易激励计划”&#xff0c;旨在提高数据场内交易的吸引力&#xff0c;解决交易入场难的问题。该计划是落实《关于构建数据基础制度更好发挥数据要素作用的意见》和《关于支持贵州…

阿里云服务器网络收发包PPS性能25万/80万/100万PPS详解

阿里云服务器ECS网络收发包PPS是什么&#xff1f;云服务器PPS多少合适&#xff1f;网络收发包PPS是指云服务器每秒可以处理的网络数据包数量&#xff0c;单位是PPS即packets per second每秒发包数量。阿里云百科来详细说下阿里云服务器网络收发包PPS性能参数表&#xff0c;以及…

Vue 事件处理器

文章目录 Vue 事件处理器事件修饰符按键修饰符 Vue 事件处理器 事件监听可以使用 v-on 指令&#xff1a; v-on <div id"app"><button v-on:click"counter 1">增加 1</button><p>这个按钮被点击了 {{ counter }} 次。</p>…

入门神经网络——浅层神经网络

文章目录 一、基础知识1.浅层神经网络介绍2.浅层神经网络的正向传播3.反向传播 二、浅层神经网络代码实例 一、基础知识 1.浅层神经网络介绍 此次构件浅层神经网络&#xff0c;相比于单神经元&#xff0c;浅层神经网络拥有多个神经元&#xff0c;因此又可以称为多神经元网络&…

【Python杂事】 处理Excel中日期时间之间没有空格问题

目录 一、数据源要求二、逻辑思路1、ROI区域2、对ROI区域进行判定 三、代码实现四、成果展示总结 碰到一个非常有趣的问题&#xff1a; 在我们的日常工作中&#xff0c;常常需要处理各种各样的数据&#xff0c;其中不乏包含日期和时间信息的数据。有时候我们会发现这些数据中日…

事件抽取的概念

1. 事件的定义 事件是指发生在某个特定的时间点或时间段、某个特定的地域范围内&#xff0c;由一个或者多个角色参与的一个或者多个动作组成的事情或状态的改变。 2. 事件基本元素 时间、地点、人物、原因、结果 3.事件抽取的定义 主要研究如何从描述事件信息的文本中抽取…

python共词矩阵分析结果一步到位

import os import re import pandas as pd from PyPDF2 import PdfFileReader import string import yakeif __name__ __main__:# 运行第一部分代码pdf_files_path C:/Users/win10/Documents/美国智库/pdf_files# 定义一个函数&#xff0c;用于读取PDF文件并将其转化成文本de…

C++学习之交互式表达式求值的详细讲解和简单代码示例

一、怎么理解交互式表达式求值&#xff1a; 交互式求表达式值是指通过命令行交互的方式&#xff0c;接收用户输入的数值和运算符号&#xff0c;然后计算出其表达式的值并返回给用户。这种方式可以方便地进行简单的计算和查错&#xff0c;也可以用于程序设计中一系列复杂的计算…

单CDN与融合CDN之间的对比:优缺点及注意事项

CDN是现代互联网服务的重要组成部分&#xff0c;它CDN可帮助内容提供者高速交付内容&#xff0c;不同的服务器部署在全球不同的数据中心&#xff0c;并在它们之间共享相同的网络路径。随着企业意识到CDN的重要性&#xff0c;越来越多的企业正在使用CDN作为内容分发工具。互联网…

完美解决丨RuntimeError: create_session() called before __init__().

错误&#xff1a; import sys sys.path.append(/home/pi/ssd-detect) import ssd_detect ssd_detect.detect(/home/pi/ssd-detect/test.jpg) 报错如下&#xff1a; Traceback (most recent call last): File "test.py", line 6, in <module ssd_detect.detect(/ho…

ArcGIS制作建设项目使用林地现状图

近年来&#xff0c;随着经济社会的快速发展&#xff0c;各地建设项目不断增多&#xff0c;占用征用林地项目的数量也呈逐年上升的趋势。根据《占用征用林地审核审批管理规范》规定&#xff0c;建设项目申请占用征用林地&#xff0c;应编制的项目使用林地可行性报告&#xff1b;…

Linux-升级CMake版本(Ubuntu18.4)

一、简介 在一些场景中&#xff0c;因为CMake版本过低而无法编译&#xff0c;此时就需要升级CMake的版本。 二、升级 卸载 先卸载旧的cmake sudo apt-get autoremove cmake 安装 切换文件夹 cd /usr/src 下载cmake包。需要哪个版本&#xff0c;可以自行修改版本号。 注&#…

中国人工智能公司CIMCAI集装箱识别云服务全球用户量领先核心科技领先,免费人工智能集装箱识别云服务,智能化港航中国人工智能公司

中国人工智能公司CIMCAI集装箱识别云服务全球用户量领先核心科技领先&#xff0c;免费人工智能集装箱识别云服务&#xff0c;智能化港航智慧港航.全球领先CIMCAI ENGINE集装箱AI检测云服务&#xff0c;集装箱号识别率99.98%&#xff0c;全球超4000企业用户使用&#xff0c;集装…

npm 包本地调试(详细流程:包本地路径、npm link 、yalc)

一、使用 包本地路径安装 package.json 中的包名叫 dzmtest&#xff08;这个才是重点&#xff09;&#xff0c;包的文件夹名 test。 获取到包的文件夹路径 执行安装命令&#xff0c;然后提示安装成功 $ npm install 包文件夹路径# 例如&#xff1a; $ npm install /Users/d…

【Linux】Linux第一个小程序-进度条

前言&#xff1a; 在之前的学习中&#xff0c;我们已经基本掌握了关于了 Linux 下的一些工具的使用&#xff0c;接下来我们运用之前学到的知识&#xff0c;我将带领大家写了一个关于 进度条 的小程序来练练手&#xff01;&#xff01;&#xff01; 本文目录 &#xff08;一&am…

密码模块非入侵式攻击及其缓解技术GMT0083-2020

密码模块非入侵式攻击&#xff0c;是一种攻击方式&#xff0c;在这种攻击中&#xff0c;攻击者不会直接访问受攻击者的密码模块。相反&#xff0c;攻击者会利用其他途径获得用户的凭证&#xff0c;然后使用这些凭证去访问密码模块。这种攻击通常使用钓鱼邮件、社交工程等技巧&a…

户外软件推荐与介绍——奥维和两步路

文章目录 &#xff08;一&#xff09;记录坐标的网站1、奥维互动地图注册2、记录坐标3、如何导出坐标点到ArcGIS4、导航5、记录轨迹6、下载离线地图 &#xff08;二&#xff09;记录轨迹的软件&#xff08;三&#xff09;离线地图的下载&#xff08;四&#xff09;如何使用3D地…

Chapter5-消息队列的核心机制

Broker 是 RocketMQ 的核心&#xff0c;大部分‘重量级”工作都是由 Broker 完成的&#xff0c;包括接收 Producer 发过来的消息、处理 Consumer 的消费消息请求、&#xff0d;消息的持久化存储、消息的 HA 机制以及服务端过滤功能等。 5.1 消息存储和发送 分布式队列因为有高…

网络协议-TCP、IP协议和互联网协议群

目录 TCP/IP协议群简介&#xff08;互联网协议群&#xff09;&#xff08;Internet Protocol Suite&#xff09; 应用层&#xff08;Application&#xff09;(合并简化了展示层&#xff0c;会话层) 传输层&#xff08;Transport&#xff09; 网络层&#xff08;Internet&am…