jest 是前端常用的一种单元测试方式。
- 安装
yarn add --dev jest
声明jest 接口
2. 创建文件准备进行单元测试
创建一个 _test_ 文件夹 用于放单元测试的代码,文件名需以spec / unit 结尾
由于单元测试不能与测试内容以外的外界环境有交流,所以需要篡改类似于fs之类的代码
_mocks_ 文件夹 就是用于篡改代码的
- 如何篡改代码(以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
- jest常用api
descripte('name',()=>{
afterEach(()=>{
clear()
})
it('can xxx', ()=>{
//expect(xxx).toBe(yyy)
})
})
- 单元测试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;