以前看了狼叔的 How-to-learn-node-correctly 这篇文章,获益匪浅,其中狼叔的 “天天看10个npm模块” 这句话让我挺震撼的,当时以为这怎么可能,但读下去才发现若是先从一些小的包入手开始,说不定还真是能够作到一段时间。
受狼叔影响,决定开此专栏【大吉大利 今晚吃包】
,不按期更新本人阅读 npm 模块源码的分享,因本人技术水平有限,若有错误,还请你们指出,谢谢。node
最近会先刷小型库集合里的包,而今天主要是吃 is-sorted 这个包。git
A small module to check if an Array is sorted.
看简介咱们知道这是一个判断数组是否被排序的模块,这里贴一下官方例子:github
var sorted = require('is-sorted') console.log(sorted([1, 2, 3])) // => true console.log(sorted([3, 1, 2])) // => false // supports custom comparators console.log(sorted([3, 2, 1], function (a, b) { return b - a }) // => true
目录结构很简单,index.js 做为入口文件,而 test 文件夹下存放测试脚本。npm
/** * @param {Array<Number>} array 被检查的数组 * @param {Function} comparator 比较器 */ module.exports = function checksort (array, comparator) { comparator = comparator || defaultComparator for (var i = 1, length = array.length; i < length; ++i) { if (comparator(array[i - 1], array[i]) > 0) return false } return true }
上面的代码简而已懂,我也加了文档注释,无非就是传入一个数组和一个比较器,若是没有传入比较器就会用默认的升序比较器。json
// 默认的升序比较器 function defaultComparator (a, b) { return a - b }
var sorted = require('../') var fixtures = require('./fixtures') var tape = require('tape') var comparators = { descending: function (a, b) { return b - a } } fixtures.forEach(function (f) { tape('returns ' + f.expected + ' for ' + f.array, function (t) { t.plan(1) var actual = sorted(f.array, comparators[f.comparator]) t.equal(actual, f.expected) }) })
单元测试的脚本很简单,tap 做为测试框架,而后把 fixtures 文件里的测试案例读取出来,接着即是一一断言。数组
// fixtures.json [ ... { "array": [1, 2, 3, 4, 6], "expected": true }, { "array": [5, 4, 3, 1, 1], "comparator": "descending", "expected": true } ... ]
这个包只能处理 number 类型的数组,有很大局限性,不过单元测试那一块给了我很大启发。若是要对一个功能进行不少测试的时候,经过相似 json 的这种方式进行测试案例配置,便可以提升工做效率,又能够减小单元测试的工做量,也算是吃这个包的一个小小收获。框架