一 背景
在实际的项目开发中,我们有时需要使用到mock模拟数据返回,从而达到前后端开发的进度并行,为了能够简化我们书写mock所带来的繁琐的过程, 所以我们需要一个工具可以快捷的将swagger的数据转化为我们需要的mock模板(都是废话),本来是准备为在公司的项目服务的,有mock和没有mock我觉得对一个程序的开发运行是有本质区别的。结果组长直接否决的,原因是:我们的数据比较复杂,这个还要写模拟数据麻烦(所以我们还是什么都不用,其实挺不开心的)。下面还是分享下开发过程的思路吧(不喜欢打字,我就想贴代码完事了其实)
二 实现思路
为了实现swagger的转化,我们需要调研swagger的数据规律,打开一个swagger页面,我们查看他的页面请求,可以找到一个http://xxxxx/v2/api-docs的请求,好了,下面已经不需要思路的,直接找规律就好了(实在没啥好说的了)
简单的补充下就是paths就是你的地址 definitions就是你的入参和出参中的对象,我们的工作就是把这个数据联系起来生成我们需要的mock数据格式
三 运气好的话说不定可以满足你的要求
运气地址 总之真的看运气了,里面还有一些问题,比如request里面不支持definitions里面的对象,对我现在的项目已经满足了,你也可以自己改改,生成的mock模板与rap2相同,我会更具接口文档中入参的必要性在request中添加一个@required字段 如果你缺少该字段将无法的到预期的结果
大致的模板如上
下面开始贴使用方式了
import Mock from 'mockjs'
Mock.setup({
timeout: '200-600'
})
var context = require.context('./mockTemplate', true, /\.js$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(context)
for (let repositoryId in RAP.interfaces) {
for (let itf of RAP.interfaces[repositoryId]) {
Mock.mock(new RegExp('^' + itf.url, 'g'), itf.method.toLowerCase(), function (options) {
let noQequest = []
switch (itf.method.toLowerCase()) {
case 'post':
noQequest = checkRequest(options.body, options.url, itf.request)
break
case 'get':
noQequest = checkRequest(options.body, options.url, itf.request)
break
}
if (noQequest.length > 0) {
return {
status: 500,
message: '缺少字段' + noQequest
}
} else {
return Mock.mock(itf.response)
}
})
}
}
function checkRequest (bodys, url, request) {
let body = bodys || []
let params = parseUrl(url) || []
let requestArr = []
Object.keys(request).forEach(item => {
if (item.indexOf('@required') > 0) requestArr.push(item.split('@')[0])
})
let noinclude = []
let assign = Object.assign(params, body)
let assignArr = Object.keys(assign)
requestArr.forEach(item => {
if (!assignArr.includes(item) || !assign[item]) noinclude.push(item)
})
return noinclude
}
function parseUrl (url) {
var pattern = /(\w+)=(\w+)/ig
var parames = {}
url.replace(pattern, function (a, b, c) {
parames[b] = c
})
return parames// 返回这个数组.
}
这里的一个重点就是使用了require.context,我们是不在一个个导入的 直接一次性的引入
同时为了防止在生产环境出现mock的假数据 增加代码:process.env.NODE_ENV === 'development' && import('@/mockCenter')
到这里就基本结束了整个mock的过程,因为我们确定不会使用,所以没有后续的优化和实战的总结,希望对需要的读者有所帮助
总结
rap2真香,我干嘛要写个转化工具