之前看了狼叔的 How-to-learn-node-correctly 这篇文章,获益匪浅,其中狼叔的 “每天看10个npm模块” 这句话让我挺震撼的,当时觉得这怎么可能,但读下去才发现如果先从一些小的包入手开始,说不定还真是可以做到一段时间。
受狼叔影响,决定开此专栏【大吉大利 今晚吃包】
,不定期更新本人阅读 npm 模块源码的分享,因本人技术水平有限,如有错误,还请大家指出,谢谢。
简介
最近会先刷小型库集合里的包,而今天主要是吃 is-sorted 这个包。
A small module to check if an Array is sorted.
看简介我们知道这是一个判断数组是否被排序的模块,这里贴一下官方例子:
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 文件夹下存放测试脚本。
主要代码
/**
* @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
}
上面的代码简而已懂,我也加了文档注释,无非就是传入一个数组和一个比较器,如果没有传入比较器就会用默认的升序比较器。
// 默认的升序比较器
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 的这种方式进行测试案例配置,即可以提高工作效率,又可以减少单元测试的工作量,也算是吃这个包的一个小小收获。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。