前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动生成__test__目录和index.spec.js工具

自动生成__test__目录和index.spec.js工具

作者头像
刘嘿哈
发布2022-10-25 14:01:04
9090
发布2022-10-25 14:01:04
举报
文章被收录于专栏:js笔记
掌握fs同步方法
使用path

在测试代码目录创建目录data,创建文件data/class.js

代码语言:javascript
复制
//class .js 文件
module.exports={
    fun1:()=>'run fun1',
    fun2:()=>'run fun2'
}

创建data/fun.js

代码语言:javascript
复制
//fun.js
module.exports=()=>'function run'

创建文件testNow目录,创建index.js写功能

代码语言:javascript
复制
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测试文件

代码语言:javascript
复制
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')
// })`)
// })

测试一下

代码语言:javascript
复制
jest  testNow
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 掌握fs同步方法
  • 使用path
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档