JS单元测试及原理
单元测试
单元测试是指对软件中的最小可测试单元进行检查和验证,通过单元测试可以检测出潜在的bug,还可以快速反馈功能输出,验证代码是否达到预期,也可以保证代码重构的安全性。
有这样一个方法:
let add = (a, b) => a + b;
这是一个很简单的计算两个数的和的方法,假如我们想看看他的逻辑对不对,我们可以调用一下,然后跟我们预期的一个值比较下,如果不符合就抛出一个错误:
let add = (a, b) => a + b;
let result = add(1, 2);
let expect = 3;
if(result !== expect){
  throw new Error(`1+2应该等于${expect},实际等于${result}`)
}
这其实就是单元测试的原理,但是这里写的方法太直白,而且不能复用,让我们改造下expect,把它变成一个通用方法:
const expect = (res) => {
  return {
    toBe: (expectRes) => {
      if(res !== expectRes){
        throw new Error(`期望值是${expectRes},但实际上却是${res}!`)
      }
    }
  }
}
我们前面期望1+2=3,这其实就是一个单元测试用例,当我们有多个用例的话,我们可以用一种更通用优雅的方式来写用例,我们来写一个通用用例方法:
const test = (desc, fn) => {
  try{
    fn();
    console.log(`${desc} -> PASS`)
  }catch(e){
    console.error(`${desc} -> FAIL`, e);
  }
}
我们用这两个通用方法来改写下我们的单元测试:
let add = (a, b) => a + b;
const expect = (res) => {
  return {
    toBe: (expectRes) => {
      if(res !== expectRes){
        throw new Error(`期望值是${expectRes},但实际上却是${res}!`)
      }
    }
  }
}
const test = (desc, fn) => {
  try{
    fn();
    console.log(`${desc} -> PASS`)
  }catch(e){
    console.error(`${desc} -> FAIL`, e);
  }
}
test('1+2=3', () => {
  expect(add(1,2)).toBe(3); // 1+2=3 -> PASS
});
test('1+2=4', () => {
  expect(add(1,2)).toBe(4); // 1+2=4 -> FAIL Error: 期望值是4,但实际上却是3!
});
上面介绍的是单元测试的原理,事实上在我们写单元测试的时候并不需要自己写expect和test共用方法,需要用到的比对方法也远远不止toBe一个。我们可以直接用第三方库Jest,他包含了几乎所有我们需要的工具,使用方法官网都有,这里主要讲原理,使用方法不再赘述
JS单元测试及原理的更多相关文章
- 玩转Node.js单元测试
		
代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模 ...
 - 啥时候js单元测试变的重要起来?
		
作为一个菜鸟,开这个专栏其实不合适,但又突然发现这个比以往任何时候都重要,所以还是写写我的感受 首先,在传统的pc上也有大量的web站点和各种项目都有复杂的js,但是基本不做单元测试,为啥呢?因为传统 ...
 - JS 单元测试
		
JS单元测试,我工作时主要以mocha + chai 下面时具体的文档: mocha: https://mochajs.org/#asynchronous-code Chai: http://chai ...
 - Sea.Js的运行原理(转)
		
1.CMD(Common Module Definition)规范 Sea.js采用了和Node相似的CMD规范,使用require.exports和module来组织模块.但Sea.js比起Node ...
 - 深入研究Node.js的底层原理和高级使用
		
深入研究Node.js的底层原理和高级使用
 - 前端测试框架对比(js单元测试框架对比)
		
前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...
 - JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
		
摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...
 - vue.js响应式原理解析与实现
		
vue.js响应式原理解析与实现 从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很 ...
 - 【JS单元测试】Qunit 和 jsCoverage使用方法
		
近日在网上浏览过很多有关js单元测试相关的文档,工具,但是,针对Qunit 和 jsCoverage使用方法,缺少详细说明,对于初入前端的人来说,很难明白其中的意思,特此整理这篇文章,希望 ...
 
随机推荐
- E - Count on a tree 树上第K小
			
主席树的入门题目,这道题的题意其实就是说,给你一棵树,询问在两个节点之间的路径上的区间第K小 我们如何把树上问题转换为区间问题呢? 其实DFS就可以,我们按照DFS的顺序,对线段树进行建树,那么这个树 ...
 - array_map  用法
			
array_map - 将回调函数作用到数组中的每一个元素上 function add2($value) { return $value + 2; } $arr = array(1, 2, 3, 4, ...
 - zoj 2954 Hanoi Tower
			
Hanoi Tower Time Limit: 2 Seconds Memory Limit: 65536 KB You all must know the puzzle named "Th ...
 - js点击按钮为元素随机字体颜色和背景色
			
文章地址 https://www.cnblogs.com/sandraryan/ 写两个button和一个div,点击按钮分别改变背景色和前景色(字体颜色).产生的是一个随机颜色. <!DOCT ...
 - 2019-7-29-WPF-元素裁剪-Clip-属性
			
title author date CreateTime categories WPF 元素裁剪 Clip 属性 lindexi 2019-7-29 10:0:13 +0800 2019-1-3 15 ...
 - java面向接口编程之适配器模式
			
使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法. 比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为; package reviewDem ...
 - Python--day38--进程同步控制的---锁\信号量\事件的方法名
 - 2019-8-31-C#-控制台使用-UAC-权限
			
title author date CreateTime categories C# 控制台使用 UAC 权限 lindexi 2019-08-31 16:55:58 +0800 2018-07-05 ...
 - phpcms 增加备案号、联系方式等字段
			
准备好记事本或者dreamweaver或者其它文本编辑器 打开\phpcms\languages\zh-cn\admin.lang.php PHPCMS的中文语言定义文件. 查找“site_manag ...
 - Online Classification
			
Another challenging trend in Internet evolution is the tremendous growth of the infrastructure in ev ...