在Fake假数据的时候,我们经常会遇到数据出现分支,或者数据的字段出现彼此依赖的情况,这对于如何写一个Mock模板结构带来了一些挑战,现在我们来看一些你可能也遇到过的案例,下面以Mockjs库为例:
Mock.mock({
'firstName': "@string('lower',3,8)",
'lastName': "@string('lower',3,8)",
'fullName': '@/firstName @/lastName'
});
上面的示例中的 fullName 字段由 firstName lastName 两个字段拼接而成,这在 Mockjs 里尚且通过字段引用生成一个合并后的字符串来实现,那么加入情况变一下,来看一下下面的示例:
Mock.mock({
"count1|1-100": 1,
"count2|1-100": 1,
"count3|1-100": 1,
"total": (@/count1 + @/count2 + @/count3)?
});
上面的代码先生成了三个 count 字段,然后最后生成一个统计字段 total 字段,它要求值是前面三个 count 带数字后缀的字段之和,如果是字符串拼接,尚且可以通过上面引用的方式来实现,但是如果要做一些其它的计算,这样的情况就变得难以处理,很多时候可能只能放弃这种精准要求,不得已模拟个差不多的数据来做替代。
再来继续看一些例子, 我们大部分时候Mock的都是请求接口的返回数据,所以就会经常遇到下面这样的例子:
Mock.mock({
"errno|0-1":1,
"errmsg|0-1":"error msg",
"data|0-10": [{
"title": "@string(10,30)",
"url": "@url()"
}]
});
尽管大部分时候上面的数据能满足基本的要求,但有点洁癖的同学都会想要实现这样的结果,但上面的 errno 字段为0的时候,我们返回的 data 数组长度应该不为空,errmsg 应该为空或者不存在。这又成了一个难题,因为Mockjs没有给我们这样的入口用来控制字段的个数,而且要能根据实际生成的值来做出对应的更改。
这些可能与Mockjs追求设计简单的初衷有关,但也带来了想要模拟复杂且更精准的数据时会显得有些无法应对。suchjs 在设计时,除了想最大化提高自定义能力的同时,也在数据的精准模拟上做了很多设计,当然,有些是suchjs以数据属性组合的形式来模拟数据带来的益处之一。现在来看看Suchjs是如何解决上面见到的一些问题的。
Such.as({
"firstName": ":lowercase:{3,8}",
"lastName": ":lowercase:{3,8}",
"fullName": ":::`:ref:&/firstName` `:ref:&/lastName`"
});
对于字符串类型,Suchjs内置支持的模板类型就能很好的解决上面的问题了,这和Mockjs的表达上没啥太大的不一致。
我们接着看上面提到的另一个需要计算和的例子:
Such.assign("plus", (values) => {
return values.reduce((ret, value) => ret + value, 0);
});
Such.as({
"count1": ":number:[1,100]",
"count2": ":number:[1,100]",
"count3": ":number:[1,100]",
"total": ":ref:&./count1,./count2,./count3:@plus"
});
上面的示例里,我们注册了一个 plus 方法用来处理多个数字引用和的逻辑,所以@处理函数的数据属性在这里充当了处理依赖值逻辑的入口,如果一个值依赖于其它字段的值,我们就可以通过 :ref 字段加入到字段的依赖字段列表里,然后通过对应的逻辑处理函数(例如这里的plus)来获得一个最终的实际值。
我们再来看最后的一个例子,在Suchjs中是如何实现动态处理的。
const instance = Such.instance({
"errno:{1}": [0, 1], // 这里字段里的冒号:表示使用后面的数组值充当枚举值
"errmsg?": "error msg", // 这里的?表示字段可能存在也可能不存在
"data{1,10}?": {
"title": ":string:{10,30}",
"url": ":url"
}
}, {
config: {
dynamics: {
"/errmsg": ["/errno", (errno) => {
return {
key:{
exist: errno.value !== 0 // 表示当errno的值不为0时字段存在,否则不存在
}
};
}],
"/data": ["/errno", (errno) => {
return {
key:{
exist: errno.value === 0 // 表示当errno的值为0时字段存在,否则不存在
min: 5 // 修改值最少为5条,动态修改data的个数
}
};
}]
}
}
});
// 生成值
instance.a();
Suchjs 在生成模拟的实例时,提供了动态配置字段值依赖来更改字段的存在性、最大条数、最小条数等字段的key 信息,于是再配合上面的 :ref 实现字段依赖,理论上,各种需要精确依赖的数据都可以通过配置或者函数入口来实现。这也是Suchjs追求实现的功能目标之一,如果您对数据模拟有类似精确的需求,欢迎使用或者到github里提意见:https://github.com/suchjs/such
此次的主题就介绍到这啦,感谢查阅~!
网友评论