单元测试

单元测试可以方便的重复测试(先写好脚本,包括一些测试套件),不用打开页面看看看点点点了
断言库即提供一套 API 帮助开发者在单元测试的过程中判定某个值是否符合预期
js 测试框架如 mocha,jest

// add.test.js 测试脚本,describe 块称为测试套件
// 所有的测试用例(it块)都应该含有一句或多句的断言。
// expect 就是断言库
var add = require('./add.js');
var expect = require('chai').expect;
describe('加法函数的测试', function() {
it('1 加 1 应该等于 2', function() {
expect(add(1, 1)).to.be.equal(2);
});
});
.not 对之后的断言取反
.deep 设置deep标记,然后使用 equal 和 property 断言 // deep.property('foo.bar.baz', 'quux')
.any 在 keys 断言之前使用 any 标记(与 all 相反)
.all 在 keys 断言之前使用 all 标记(与 any 相反)
.a(type) / .an(type) 被测试的值的类型
.include(value) / contains(value) 既可作为属性类断言前缀语言链又可作为作为判断数组、字符串是否包含某值的断言使用
.ok 断言目标为真值
.true 断言目标为 true // 还有 false/null/undefined/NaN
.exist 断言目标存在,即非 null 也非 undefined
.empty 断言目标的长度为 0,检查对象时看枚举属性数量
.equal(value) 断言目标严格等于(===),如果设置了 deep 标记,则断言目标深度等于 value
.eql(value) 断言目标深度等于 value
.above(value) 断言目标大于(超过)value
.least(value) 断言目标不小于(大于或等于)value
.below(value) 断言目标小于 value
.most(value) 断言目标不大于(小于或等于)value
.within(start, finish) 断言目标在某个区间内
.instanceof(constructor) 断言目标是构造函数的一个实例
.property(name, [value]) 断言目标是否拥有某个名为 name 的属性 // 使用 deep 标记可以读深层属性
.ownProperty(name) 断言目标拥有名为 name 的自有属性
.ownPropertyDescription(name[, descriptor]) 断言目标的某个自有属性存在描述符对象
.length 设置 .have.length 标记作为比较 length 属性值的前缀
.lengthOf(value) 断言目标的 length 属性为期望的值
.match(regexp) 断言目标匹配到一个正则表达式
.string(string) 断言目标字符串包含另一个字符串
.keys(key1, [key2], […]) 断言目标包含传入的属性名 // 可与 any,all,contains 或者 have 前缀结合使用
.throw(constructor) 断言目标函数会抛出一个指定错误或错误类型 // ErrorConstroctor | String | RegExp
.respondTo(method) 断言目标类或对象会响应一个方法 // itself 标记检查静态方法
.satisfy(method) 断言目标值能够让给定的测试器返回真值
.closeTo(expected, delta) 断言目标数字等于 expected,或在期望值的 +/-delta 范围内
.members(set) 断言目标是 set 的超集
.oneOf(list) 断言目标值出现在 list 数组的某个顶层位置
.change(object, property) 断言目标方法会改变指定对象的指定属性
.increase(object, property) 断言目标方法会增加指定对象的属性
.decrease(object, property) 断言目标方法会减少指定对象的属性
.extensible 断言目标对象是可扩展的
.sealed 断言目标对象是封闭的
.frozen 断言目标对象是冻结的

// 在前端中,"单元"可对应到组件,vue, react 基于 VDOM,可以很方便的支持测试