愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

Jest中提供的工具(jest-platform)总结

Jest中有一些独立的包,我们可以使用这些包来使用一些Jest的特性。这些可能对于开发一些工具,做一些自动化流程时是非常有帮助的

一、jest-changed-files

用来识别git/hg仓库文件变更的工具,暴露了两个方法:

  • getChangedFilesForRoots 获取指定目录下变更的文件,返回一个Promise
  • findRepos 找出在指定路径下的仓库有哪些

示例:

const { getChangedFilesForRoots } = require('jest-changed-files')
getChangedFilesForRoots(['./'], { lastCommit: true }).then((result) => {
    console.log(result.changedFiles)
    console.log(result.repos)
})

二、jest-diff

可视化数据变更的工具,暴露了一个方法,这个方法能够比较任意类型的两个值,然后返回一个格式化好的字符串,直观地表示两个值的差异部分
示例:

const diff = require('jest-diff')
const a = { a: { b: { c: 5 } } }
const b = { a: { b: { c: 6 } } }

console.log(diff(a, b))

会打印类似于如下的字符串:

- Expected
+ Received

  Object {
    "a": Object {
      "b": Object {
-       "c": 5,
+       "c": 6,
      },
    },
  }

三、jest-docblock

抽取和解析JavaScript文件头部注释的工具,示例:

const { parseWithComments } = require('jest-docblock')
const code = `
/**
 * This is a variable
 *
 * @var {string}
 */
const greetWords = 'Hello, world!'
`
const parsed = parseWithComments(code)
console.log(parsed)

输出的包含:

  • result.comments 注释,如:/**\nThis is a variable\n\n/\nconst greetWords = \'Hello, world!\'
  • result.pragmas 注解,如:`{ var: '{string}' }

四、jest-get-type

识别JavaScript原始类型的模块,如下:

const getType = require('jest-get-type')

const array = [1, 2, 3]
const nullValue = null
const undefinedValue = undefined

console.log(getType(array)) // 输出:'array'
console.log(getType(nullValue)) // 输出:'null'
console.log(getType(undefinedValue)) // 输出:'undefined'

四、jest-worker

用于任务并行化的模块。暴露了Worker类,接收Node.js模块路径作为参数,然后就可以像调用类的方法那样调用模块的导出方法。当指定方法在一个fork进程中执行完毕时,会返回一个resolvedPromise,例子如下:

// workerScripts.js 
module.exports = {
    heavyTasks: num => {
        // Long running CPU intensive tasks
        while (num > 1) {
            num = Math.sqrt(num)
        }
        return num
    }
};
// main.js
const Worker = require('jest-worker').default
async function main() {
    const worker = new Worker(require.resolve('./workerScripts'))
    const results = await Promise.all([
        worker.heavyTasks(1e10),
        worker.heavyTasks(1e11)
    ])
    console.log(results)
}
main()

五、pretty-format

暴露一个方法,这个方法可以将任意的JavaScript值转化为人类易读的字符串,开箱即支持全部的JavaScript内置类型,并且可以通过用户自定义插件来进行扩展,如下:

const prettyFormat = require('pretty-format')

const val = { object: {} }
val.circularReference = val
val[Symbol('foo')] = 'foo'
val.map = new Map([['prop', 'value']])
val.array = [-0, Infinity, NaN]

console.log(prettyFormat(val))

输出:

Object {
  "array": Array [
    -0,
    Infinity,
    NaN,
  ],
  "circularReference": [Circular],
  "map": Map {
    "prop" => "value",
  },
  "object": Object {},
  Symbol(foo): "foo",
}

附件

本文中的代码,可查看:
https://github.com/trialground/sample-of-jest/blob/master/src/platform.js