之前看了狼叔的 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 的这种方式进行测试案例配置,即可以提高工作效率,又可以减少单元测试的工作量,也算是吃这个包的一个小小收获。


super2god
32 声望3 粉丝