在测试代码目录创建目录data,创建文件data/class.js
//class .js 文件
module.exports={
fun1:()=>'run fun1',
fun2:()=>'run fun2'
}
创建data/fun.js
//fun.js
module.exports=()=>'function run'
创建文件testNow目录,创建index.js写功能
const path = require('path');
const fs = require('fs')
module.exports = class TextNow {
// 接收要生成测试代码的文件路径
getJestSource(sourcePath = path.resolve('./')) {
// 创建测试文件__test__
const testPath = `${sourcePath}/__test__`
if (!fs.existsSync(testPath)) {
fs.mkdirSync(testPath);
}
// 遍历代码文件
let list = fs.readdirSync(sourcePath);
// 拼接成绝对路径
list.map(v => `${sourcePath}/${v}`)
.filter(v => fs.statSync(v).isFile())//是文件的留下
// 排除测试代码
.filter(v => v.indexOf('.spec') === -1)
// 遍历生成文件
.map(filename => this.getTestFile(filename))
}
// 此方法读取文件,根据判断是函数或者对象,解析为单个函数,生成测试代码,写入测试代码文件
getTestFile(filename) {
// 获取测试代码路径
const testFileName = this.getTestFileName(filename)
// 判断是否有这个文件
if (fs.existsSync(testFileName)) {
console.log('该测试代码存在');
return;
}
const mod = require(filename);
let source
if (typeof mod === 'object') {
source = Object.keys(mod).map(v => this.getTestSource(v, path.basename(filename),true))
.join('\n')
} else if (typeof mod === 'function') {
const basename = path.basename(filename);
source = this.getTestSource(basename.replace('.js', ''), basename)
}
// 写入文件
fs.writeFileSync(testFileName, source);
}
/**
*
*
* @param {*} methodName 方法名
* @param {*} classFile 文件路径
* @param {*} isClass 是否是类
*/
getTestSource(methodName, classFile, isClass = false) {
return `test('${'TEST ' + methodName}',()=>{
const ${isClass ? '{' + methodName + '}' : methodName}=require('${'../' + classFile}')
const ret=${methodName}()
// expect(ret)
// .toBe('test ret')
})`
}
/**
* 此方法获取测试代码相对路径及文件名
* @param {*} filename 代码的文件名
*/
getTestFileName(filename) {
// 目录名
const dirName = path.dirname(filename);
// 文件名
const baseName = path.basename(filename)
// 获取扩展名
const extName = path.extname(filename);
// 新的文件名
const testName = baseName.replace(extName, `.spec${extName}`)
return path.format({
// 目录
root: dirName + '/__test__/',
// 文件名
base: testName
})
}
}
//创建test/.index.spec.js测试文件
const fs = require('fs');
test('集成测试 测试生成测试代码文件', () => {
// 准备环境
// 删除测试文件夹
fs.rmdirSync(__dirname + '/data/__test__', {
// 深度删除
recursive: true
})
// 获取类创建实力,调用生成测试方法
const src = new (require('./../index'))()
src.getJestSource(__dirname + '/data')
})
// test('测试 自动生成测试文件名',()=>{
// const src=new (require('./../index'))();
// const ret=src.getTestFileName('./abc/class.js');
// expect(ret).toBe('./abc/__test__/class.spec.js');
// })
// test('测试 测试代码生成',()=>{
// const src=new (require('../index'))()
// const ret=src.getTestSource('fun','class')
// console.log(ret,'ret')
// expect(ret).toBe(`test('TEST fun',()=>{
// const fun=require('../class')
// const ret=fun()
// // expect(ret)
// // .toBe('test ret')
// })`)
// })
测试一下
jest testNow