前端实现单元测试(代码版)

2023-11-13

Jest使用

  • 下载
    • npm install --save-dev jest ts-jest ts-node @jest/globals @types/jest
      • 在nodejs中支持ts
  • ts执行报错
    • npx ts-jest config:init
  • jest 会自动运行 sum.test.js 文件,其默认匹配规则

    匹配 test 文件夹下的 .js 文件(.jsx .ts .tsx 也可以)
    匹配所有后缀为 .test.js 或 .spec.js 的文件(.jsx .ts .tsx 也可以)
    可以通过根目录下的 jest.config.js 文件自定义测试文件匹配规则

  • package.json
    "scripts": {
      "test": "jest --watchAll", //跑测试用例使用
      "test-c": "jest --coverage" //查看测试用例有哪些代码没有覆盖到
    }
    

使用流程

Jest 解析

  • 匹配器

    toBe使用 Object.is来进行精准匹配的测试
    test(‘two plus two is four’, () => {
    expect(2 + 2).toBe(4);
    });

  • toEqual 递归检查对象或数组的每个字段。

    test(‘对象赋值’, () => {
    const data = {one: 1};
    data[‘two’] = 2;
    expect(data).toEqual({one: 1, two: 2});
    });

  • 可以使用与匹配相反的 not 来进行测试

    test(‘adding positive numbers is not zero’, () => {
    for (let a = 1; a < 10; a++) {
    for (let b = 1; b < 10; b++) {
    expect(a + b).not.toBe(0);
    }
    }
    });

  • 真值

    代码中的undefined, null, and false有不同含义,若你在测试时不想区分他们,可以用真值判断。 Jest提供helpers供你使用。
    toBeNull 只匹配 null
    toBeUndefined 只匹配 undefined
    toBeDefined 与 toBeUndefined 相反
    toBeTruthy 匹配任何 if 语句为真
    toBeFalsy 匹配任何 if 语句为假

  • 数字

    大多数的比较数字有等价的匹配器。

    test(‘two plus two’, () => {
    const value = 2 + 2;
    expect(value).toBeGreaterThan(3);
    expect(value).toBeGreaterThanOrEqual(3.5);
    expect(value).toBeLessThan(5);
    expect(value).toBeLessThanOrEqual(4.5);
    // toBe and toEqual are equivalent for numbers
    expect(value).toBe(4);
    expect(value).toEqual(4);
    });

  • 对于比较浮点数相等,使用 toBeCloseTo 而不是 toEqual,因为你不希望测试取决于一个小小的舍入误差。

    test(‘两个浮点数字相加’, () => {
    const value = 0.1 + 0.2;
    //expect(value).toBe(0.3); 这句会报错,因为浮点数有舍入误差
    expect(value).toBeCloseTo(0.3); // 这句可以运行
    });
    });

  • 字符串
    您可以检查对具有 toMatch 正则表达式的字符串︰

    test(‘there is no I in team’, () => {
    expect(‘team’).not.toMatch(/I/);
    });

    test(‘but there is a “stop” in Christoph’, () => {
    expect(‘Christoph’).toMatch(/stop/);
    });

  • 数组和可迭代对象

    你可以通过 toContain来检查一个数组或可迭代对象是否包含某个特定项:

    const shoppingList = [
    ‘diapers’,
    ‘kleenex’,
    ‘trash bags’,
    ‘paper towels’,
    ‘milk’,
    ];

    test(‘shoppingList数组中包含milk’, () => {
    expect(shoppingList).toContain(‘milk’);
    expect(new Set(shoppingList)).toContain(‘milk’);
    });

  • 例外

    若你想测试某函数在调用时是否抛出了错误,你需要使用 toThrow。

    function compileAndroidCode() {
    throw new Error(‘you are using the wrong JDK!’);
    }

    test('compiling android goes as expected', () => {
      expect(() => compileAndroidCode()).toThrow();
      expect(() => compileAndroidCode()).toThrow(Error);
      // You can also use a string that must be contained in the error message or a regexp
      expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
      expect(() => compileAndroidCode()).toThrow(/JDK/);
      // Or you can match an exact error message using a regexp like below
      expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails
      expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass
    });
    

code

  • jest.config.js

    • 配置
    /** @type {import('ts-jest').JestConfigWithTsJest} */
    
    module.exports = {
      preset: 'ts-jest',
      testEnvironment: 'node',
      testMatch: [
        // glob 格式
        // '**/__tests__/**/*.[jt]s?(x)',
        '**/__test__/**/*.[jt]s?(x)',//指定文件夹,其他tests文件夹不测试
        // '**/?(*.)+(spec|test).[jt]s?(x)',
      ],
      // 正则表达式格式,与 testMatch 互斥,不能同时声明
      // testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$',
    };
    
    
  • utils/index.tsx

    • 需要测试的函数
    export function toDigit(num): string {
      if (!num) {
        return '-';
      }
      const numArr = (`${num}`).split('.');
      num = numArr[0];
      let result = '';
      while (num.length > 3) {
        result = `,${num.slice(-3)}${result}`;
        num = num.slice(0, num.length - 3);
      }
      if (num) {
        result = num + result;
      }
      if (numArr.length === 1) {
        return `${result}.00`;
      } else if (numArr[1].length === 2) {
        return `${result}.${numArr[1]}`;
      } else {
        return `${result}.${numArr[1]}0`;
      }
    }
    
    
  • __test__/toDigit.test.ts

    • 编写单测, expect断言
import { describe, test, expect } from '@jest/globals';
import { toDigit } from '../src/utils/index';

const arr: number[] = [2344513099.66, 53450000, 0];

describe('utils toDigit test', () => {
  test('toDigit test 1', () => {
    expect(toDigit(arr[0])).toBe('2,344,513,099.66');
  });
  test('toDigit test 2', () => {
    expect(toDigit(arr[1])).toBe('53,450,000.00');
  });
  test('toDigit test 3', () => {
    expect(toDigit(arr[2])).toBe('-');
  });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端实现单元测试(代码版) 的相关文章

  • Imgur API 版本 3 JavaScript 上传示例

    我在网上找到的所有示例都是早期版本的 Imgur API 或非 JS 代码 所有这些都使用新 API 中不存在的 API 密钥 相反 你会得到一个client id and secret 任何人都有示例代码 展示如何使用其 API 版本 3
  • onclick 函数上的 CSS 选择器

    有没有办法让CSS选择器onclick function 您可以在onclick https stackoverflow com questions 24365416 select element which have specific a
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • 使用画布元素作为文本区域

    我正在寻找有关如何使用类似于文本区域的画布元素的直接描述 我见过这样的项目Ace http ace ajax org 只是想知道如何像文本区域一样写入该区域 只是纯文本 没有什么花哨的 提前致谢 Ace 曾经是 Mozilla Skywri
  • 1分30秒倒计时器javascript

    我有代码 但它适用于 2 分钟计时器 我需要将其修改为 1 分 30 秒计时器 我已经尝试过 但未能从 1 30 开始计时器 因为我是这一行的初学者 并且想学习如何做到这一点 这是代码 div div
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • Disqus 评论数始终为 0 条评论

    我想我已经按照通用代码的说明设置了 Disqus 问题是它总是说某个帖子有 0 条评论 拿这个帖子来说 http tx0rx0 com retropie and the raspberry pi http tx0rx0 com retrop
  • 如何在 javascript 或 jquery 中按尺寸对图像进行排序

    如何在 JavaScript 或 jQuery 中按尺寸对图像进行排序 我的代码如下 var imgsrc if document images length lt 1 alert No images to open return for
  • JavaScript 原型 - 请澄清

    有人可以帮我理解原型属性吗 我不明白原型属性是函数的属性还是函数内部的属性 假设我们创建以下构造函数 Food 此时 函数 Food 具有 Food prototype 属性 由于 Food 是 Object 的实例 因此这意味着 Obec
  • 禁用整个站点的 IE8 加速器

    是的 我知道有类似的问题 https stackoverflow com questions 499565 is it possible to disable ie8 accelerators on my website在 SO 上 但它已
  • 如何删除从 javascript var 转义的反斜杠?

    我有这个变量 var x div class Which is div class 但是我需要 div class abcdef 我怎样才能 unes cape 这个变量来删除所有转义字符 您可以通过正则表达式将反斜杠后跟引号替换为仅引号
  • FormData 中的 Blob 为 null

    我正在尝试通过远程 API 通过 ajax 在 android 中发送创建的照片 我在用着相机图片背景 https github com an rahulpandey cordova plugin camerapicturebackgrou
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 使用 Javascript eval() 100% 安全吗?

    我正在编写一个生成 Javascript 代码的 PHP 库 Javascript 代码有许多名为component001 component002 etc 页面通过 AJAX 动态加载 我需要通过 URL 变量传递组件的名称 然后由脚本进
  • 当表格在 IE 中获得焦点时,表格滚动条会向上跳跃

    问题 我有一个table有包装的div with overflow y auto 一旦table获得焦点 滚动条向上跳 我怎样才能防止这种情况发生 我经历过这种行为IE9 不在 Chrome 中 请注意 我已添加tabindex到桌子上 以
  • 使用 javascript 调整图像大小以在画布 createPattern 中使用

    我见过一些关于如何调整图像大小的技巧 在 IMG 标签内使用 但我想在里面有一个图像变量 一个 Javascript 调整它的大小 然后使用 a 中的图像 context createPattern 图像 重复 我还没有找到任何提示 关于如
  • 不可见的 reCAPTCHA - 缺少必需的参数:sitekey

    我正在为每个带有具有类的按钮的表单动态加载不可见的 reCAPTCHAg recaptcha 我遇到的问题是验证码未正确加载 我不知道为什么 我按照验证码网站上的文档进行操作 但我不确定如何以及为什么会出现此错误 Uncaught Erro
  • 使用 Socket.IO 时如何访问会话标识符?

    我有一个聊天 我需要管理独特的连接 我四处搜寻 但我找到的解决方案似乎都已被弃用 那么 如何使用 Socket IO 获取套接字的会话 ID 我在用着Node js http en wikipedia org wiki Node js Ex
  • Morgan Logger + Express.js:写入文件并在控制台中显示

    我正在尝试将 Morgan 与 Express js 结合使用来编写日志文件 同时也在控制台上显示我的日志 我正在使用这段代码 var logger require morgan var accessLogStream fs createW
  • 如何从react-bootstrap复选框获取值/属性?

    我正在尝试使用反应引导复选框 https react bootstrap github io components html forms controls https react bootstrap github io components

随机推荐

  • 【大数据】Flink 详解(六):源码篇 Ⅰ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 如何解决主机发送地址之后 从机没有发出ACK应答信号给主机

    1 iic总线从机没有返回应答给主机 我用的一个带有iic接口电量计和我的单片机通讯 我用逻辑分析仪分析数据发现主机写一个字节数据后从机并没有返回一个ack给主机 导致我后面读取从机的数据时全部是ff 请问各位iic大神 我该怎么去查问题呢
  • 给kali的Metasploit下添加一个新的exploit

    转载 https blog csdn net SilverMagic article details 40978081 首先在 usr share metasploit framework modules exploits 目录下新建一个自
  • SpringCloud01:认识微服务

    SpringCloud01 1 认识微服务 随着互联网行业的发展 对服务的要求也越来越高 服务架构也从单体架构逐渐演变为现在流行的微服务架构 这些架构之间有怎样的差别呢 1 0 学习目标 了解微服务架构的优缺点 1 1 单体架构 单体架构
  • 从服务器拿文件,怎么从远程服务器拿文件夹

    怎么从远程服务器拿文件夹 内容精选 换一换 添加节点时提示 添加节点失败 节点已存在 待添加节点的服务器上已安装系统性能分析或者添加过节点 如果待添加节点的服务器上已安装系统性能分析 需要登录服务器卸载系统性能分析 详细步骤请参见卸载 卸载
  • [一步一步学react系列] 04—计算器Demo

    前言 之前的例子都是写的计数器 加一减一的功能 我们大致弄懂了redux分层和store数据管理 下面我们将结合现有知识写一个终极版的计算器 以此巩固所学知识 知识点 redux分层 react router 一些算法及数据结构知识 栈 中
  • 调用ChatGpt openai官方node.js包Error: connect ETIMEDOUT问题

    原因是调用的axios库不走系统代理 需要额外配置 openai在文档中有说明增加axios配置的方法 只需请求时配置下proxy就ok了
  • Understand(代码分析工具)的安装教程

    前言 最近在学习嵌入式系统时 写的代码越来越多 一个文件里面函数的数量也越来越多 为方便查看写了哪些函数 以及文件总体架构 在网上找了半天 找到了Understand这款神器 相比于vscode 该软件占内较少 查看结构更直接 文章目录 前
  • JavaScript 获取数组的最后一个元素

    index取值 args args length 1 pop方法 args pop 注意 pop方法会删除args最后一个元素 并返回
  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485
  • 计算机网络基础概论

    什么是Internet 从具体构成角度看 端系统 主机节点 主机及其上运行的网络应用程序 和网络交换设备 数据交换节点 中继器 路由器 交换机 负载均衡设备等 边 通信链路 分为接入网链路和骨干链路 接入网链路是指主机连接到互联网的链路 骨
  • java开发异常类型汇总

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Java 5-1、用户模块-Mybatis代码生成

    5 1 用户模块 Mybatis代码生成 从这里开始 环境相关配置就告一段落了 项目就开始进入开发学习阶段 一 代码生成 实体类 Mapper接口 Mapper xml 分别生成 AppUser java SysUser java 再抽取B
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

    Python题目 学生信息管理系统 高级版 图形界面 MySQL数据库 使用图形界面显示 选用list tuple dictionary或map等数据结构 操作数据库存储X个学生的三门课的成绩 机器学习 Python程序设计 研究生英语 并
  • #BDA#笔记#阶段一:熟悉要分析的数据

    学习参考 1 小灶能力派 BDA证书班
  • java jhat_java命令--jhat命令使用

    jhat也是jdk内置的工具之一 主要是用来分析java堆的命令 可以将堆中的对象以html的形式显示出来 包括对象的数量 大小等等 并支持对象查询语言 使用jmap等方法生成java的堆文件后 使用其进行分析 第一步 导出堆 jmap d
  • 将一组很大的数据集随机分成两组数据

    最近在看机器学习的东西时发现了一些特别好玩的东西 机器学习中又分为训练集和测试集 如何把一组很大的数据分为这两个集合呢 可以使用接下来的函数完成 当然由于random这个随机数生成函数每次产生的数不一定都是刚好达到你的期望 所以总会有一点小
  • 【大数据入门核心技术-Impala】(一)Impala简介

    目录 一 Impala介绍 二 Impala优势 三 Impala主要功能 一 Impala介绍 Impala是Cloudera公司主导开发的新型查询系统 它提供SQL语义 能查询存储在Hadoop的HDFS和HBase中的PB级大数据 已
  • hibernateCRUD

    本文章的目的是实现hibernateDao层功能 但是具体的操作不在Dao层内完成 实体类 package com hibernate entity public class User private int id private Stri
  • 前端实现单元测试(代码版)

    Jest使用 下载 npm install save dev jest ts jest ts node jest globals types jest 在nodejs中支持ts ts执行报错 npx ts jest config init