以前看了狼叔的 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 的這種方式進行測試案例配置,便可以提升工做效率,又能夠減小單元測試的工做量,也算是吃這個包的一個小小收穫。框架