美文网首页
使用Suchjs来模拟关联数据

使用Suchjs来模拟关联数据

作者: 轩子哲 | 来源:发表于2022-04-07 11:09 被阅读0次

在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

此次的主题就介绍到这啦,感谢查阅~!

相关文章

网友评论

      本文标题:使用Suchjs来模拟关联数据

      本文链接:https://www.haomeiwen.com/subject/ljbjsrtx.html