主要依赖
yarn add commander //用于添加指令
yarn add inquirer //用于添加询问
commonder Api
program
.command('add')//添加一个add指令
.description('add a task')//添加描述
.action((...args) => {//action会接受一个回调函数,指令后传入的参数
const words = args.slice(0, -1).join(' ')
//下面这一行是自己封装的api将输入的参数 变成一个任务
api.add(words).then(() => { console.log('添加成功') }, () => { console.log('添加失败') })
})
program
.command('clear')//添加一个clear指令
.description('clear all tasks')//描述
.action(() => {
api.clear().then(() => { console.log('清除完毕') }, () => { console.log('清除失败') })
})
program.parse(process.argv)
if (process.argv.length === 2) {//如果没有传入参数,进行showAll操作(默认的两个路径会让参数长度变成2)
// 说明用户直接运行 node cli.js
void api.showAll()
}
以上是commonder的部分用法,具体用法可去官网查看
inquirer
inquirer.prompt([//接受一个数组,里面可接受多个对象
{
type: 'list',//还有input以及其他类型,官网都有范例
name: 'index',//这里的的name 是chioces里面value的key,通过answer.index可以拿到choices的结果
message: '请选出你想操作的任务?',
choices: [{ name: "退出", value: '-1' }, ...list.map((task, index) => {
return { name: `${task.done ? "[已完成]" : "[未完成]"} ${index + 1}-${task.title}`, value: index.toString() }
}), { name: "+创建", value: "-2" }],
}
]).then((answers) => {
const index = parseInt(answers.index)
if (index >= 0) {
askForAction(list, index)
} else if (index === -2) {
askForCreateTask(list)
}
});
demo
使用jest添加测试用例
yarn add --dev jest
//新建sum.js
module.exports = (a, b) => {
return a + b
}
//新建sum.test.js
const sum = require('./sum')
test('add 参数1+参数2 的结果等于3', () => {
expect(sum(1, 3)).toBe(4)
})
//命令行执行yarn test 查看测试结果(不要忘了配置package.json添加test指令哦)
添加读写测试用例
为了减少单元测试受外界的影响,所以我们模拟一个fs模块来测试读写文件
//记得新建__mocks__目录哦
const fs = jest.createMockFromModule('fs');//模拟一个fs模块
const _fs = jest.requireActual('fs')//真实的fs模块
Object.assign(fs, _fs)//复制真实的fs方法
const mocks = {}//用于存储数据,当调用fs.setMock传入对应的参数,就可以形成一个闭包,储存数据
fs.setMock = (path, error, data) => {
mocks[path] = [error, data]
}
fs.readFile = (path, options, callBack) => {//覆盖复制过来的readFile方法
if (callBack === undefined) { callBack = options }
if (path in mocks) {//如果路径在mocks中拿到刚才注册的数据
callBack(...mocks[path])
} else {//不在,那就调用真实的fs.readFile
_fs.readFile(path, options, callBack)
}
}
module.exports = fs;
//测试文件内关键代码
const db = require('../db.js')//要测试的接口
const fs = require('fs')
jest.mock('fs')
it('can read', async () => {
const data = [{ title: 'hi', done: true }]
fs.setMock('/xxx', null, JSON.stringify(data))
const list = await db.read('/xxx')
expect(list).toStrictEqual(data)
})