jest 单元测试初识

201 阅读1分钟

jest 是前端常用的一种单元测试方式。

  1. 安装
yarn add --dev jest

声明jest 接口

2. 创建文件准备进行单元测试

创建一个 _test_ 文件夹 用于放单元测试的代码,文件名需以spec / unit 结尾

由于单元测试不能与测试内容以外的外界环境有交流,所以需要篡改类似于fs之类的代码

_mocks_ 文件夹 就是用于篡改代码的

  1. 如何篡改代码(以fs为例子)
// spec文件中 , 引入真fs , 以及篡改fs
const fs = require('fs')
jest.mock('fs')
//mocks文件中
const fs = jest.genMockFromModule('fs');
//声明假fs
const _fs = jest.requireActual('fs')
//声明真fs
Object.assign(fs, _fs)
//将真fs的内容复制给假fs , 中篡改所需要的api
  1. jest常用api
descripte('name',()=>{
	afterEach(()=>{
    	clear()
    })
    it('can xxx', ()=>{
    	//expect(xxx).toBe(yyy)
    })
})
  1. 单元测试fs举例
//fs.js
const fs = jest.createMockFromModule('fs');
const _fs = jest.requireActual('fs')
Object.assign(fs, _fs)

const hash = {}

fs.setMock = (path, error, success) => {
  hash[path] = [error, success]
}

fs.readFile = (path, options, callback) => {
  if (callback === undefined)callback = options
  console.log(path)
  callback(hash[path][0], hash[path][1])
}

module.exports = fs;

//测试文件
const db = require('../db')
const fs = require('fs')
jest.mock('fs')
describe('db', () => {
  it('should read', async function () {
    fs.setMock('/xxx', null, "[]")
    const list = await db.read('/xxx')
    expect(list).toStrictEqual([])
  });
})

写同理,需要注意的是,在写完之后调用一下回调,来保证函数已经执行完毕

const fs = jest.createMockFromModule('fs');
const _fs = jest.requireActual('fs')
Object.assign(fs, _fs)

const hash = {}

fs.setMock = (path,data,fn) => {
  hash[path] = {error:null}
  fn(data)
}

fs.writeFile = (file, data, options, callback) => {
    if (callback === undefined) callback = options
    hash[file].data = JSON.stringify(data)
    callback()
}

module.exports = fs;