如何测试读文件

826 阅读1分钟

使用jest

yarn add --dev jest
抄官方文档的例子
__test__目录是测试目录,这是jest的约定
单元测试文件名一般为xxx.unit.js或者xxx.spec.js
单元测试不应该与外界打交道(那是集成测试要做的)
单元测试的对象是函数
功能测试的对象是模块
集成测试的对象是系统

jest mock fs模块(读文件)

//要测试的db.js
// const homedir = require('os').homedir()
// const home = process.env.HOME || homedir
// const p = require('path')
// const fs = require('fs')
// const dbPath = p.join(home, '.todo')


const db = {
    read(path = dbPath) {
        return new Promise((resolve, reject) => {
            fs.readFile(path, { flag: 'a+' }, (error, data) => {//这里将来会调用,jest 的f s,而不是node自身的fs
                if (error) return reject(error)
                let list
                try {
                    list = JSON.parse(data.toString())
                } catch (error2) {
                    list = []
                }
                resolve(list)
            })
        })
    }
}
module.exports = db


//__mocks__下的fs.js

const fs = jest.genMockFromModule('fs')//jest的fs
const _fs = jest.requireActual('fs')//实际的fs
Object.assign(fs, _fs)

const mocks = {}

fs.setMock = (path, error, data) => {//设置将来接受的路径和数据
    mocks[path] = [error, data]//储存数据
}

fs.readFile = (path, options, callback) => {//如果
    console.log('我其实执行的是这个呀')
    if (callback === undefined) {
        callback = options
    }
    if (path in mocks) {
        callback(...mocks[path])
    } else {
        _fs.readFile(path, options, callback)
    }

}
module.exports = fs
//__test__下的read.spec.js

const db = require('../db.js')//要测试的db.js
const fs = require('fs')
jest.mock('fs')//将node的fs模块换成自己__mock__中的fs
describe('这是单元测试', () => {
    it('can red', async () => {
        const data = []
        fs.setMock('./xxx', null, JSON.stringify(data))
        const list = await db.read('./xxx')
        // console.log(list)
        // expect(list).toStrictEqual(data)
    })
})

源码链接