目 录CONTENT

文章目录

mock

Administrator
2020-07-24 / 0 评论 / 0 点赞 / 13442 阅读 / 11534 字 / 正在检测是否收录...

Mock使用

Mock是前后端分离开发过程中,用于前端请求的模块数据工具,它可以模拟后端的接口请求

开始 & 安装

$ npm install mockjs

语法规范

Mock.js 的语法规范包括两部分:

  1. 数据模板定义规范(Data Template Definition,DTD)
  2. 数据占位符定义规范(Data Placeholder Definition,DPD)

数据模板定义规范 DTD

// 属性名   name
// 生成规则 rule
// 属性值   value
'name|rule': value

注意

  • 属性名生成规则 之间用竖线 | 分隔。
  • 生成规则 是可选的。
  • 生成规则 有 7 种格式:
    1. 'name|min-max': value
    2. 'name|count': value
    3. 'name|min-max.dmin-dmax': value
    4. 'name|min-max.dcount': value
    5. 'name|count.dmin-dmax': value
    6. 'name|count.dcount': value
    7. 'name|+step': value
  • 生成规则 的 含义 需要依赖 属性值的类型 才能确定
  • 属性值 中可以含有 @占位符
  • 属性值 还指定了最终值的初始值和类型。

生成规则示例

  1. 属性值是字符串 String

    1. 'name|min-max': string

      通过重复 string 生成一个字符串,重复次数大于等于 min,小于等于 max

    2. 'name|count': string

      通过重复 string 生成一个字符串,重复次数等于 count

  2. 属性值是数字 Number

    1. 'name|+1': number

      属性值自动加 1,初始值为 number

    2. 'name|min-max': number

      生成一个大于等于 min、小于等于 max 的整数,属性值 number 只是用来确定类型。

    3. 'name|min-max.dmin-dmax': number

      生成一个浮点数,整数部分大于等于 min、小于等于 max,小数部分保留 dmindmax 位。

    Mock.mock({
        'number1|1-100.1-10': 1,
        'number2|123.1-10': 1,
        'number3|123.3': 1,
        'number4|123.10': 1.123
    })
    // =>
    {
        "number1": 12.92,
        "number2": 123.51,
        "number3": 123.777,
        "number4": 123.1231091814
    }
    
  3. 属性值是布尔型 Boolean

    1. 'name|1': boolean

      随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。

    2. 'name|min-max': boolean

      随机生成一个布尔值,值为 value 的概率是 min / (min + max),值为 !value 的概率是 max / (min + max)

  4. 属性值是对象 Object

    1. 'name|count': object

      从属性值 object 中随机选取 count 个属性。

    2. 'name|min-max': object

      从属性值 object 中随机选取 minmax 个属性。

  5. 属性值是数组 Array

    1. 'name|1': array

      从属性值 array 中随机选取 1 个元素,作为最终值。

    2. 'name|+1': array

      从属性值 array 中顺序选取 1 个元素,作为最终值。

    3. 'name|min-max': array

      通过重复属性值 array 生成一个新数组,重复次数大于等于 min,小于等于 max

    4. 'name|count': array

      通过重复属性值 array 生成一个新数组,重复次数为 count

  6. 属性值是函数 Function

    1. 'name': function

    执行函数 function,取其返回值作为最终的属性值,函数的上下文为属性 'name' 所在的对象。

  7. 属性值是正则表达式 RegExp

    'name': regexp
    

    根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串。

    Mock.mock({
        'regexp1': /[a-z][A-Z][0-9]/,
        'regexp2': /\w\W\s\S\d\D/,
        'regexp3': /\d{5,10}/
    })
    // =>
    {
        "regexp1": "pJ7",
        "regexp2": "F)\fp1G",
        "regexp3": "561659409"
    }
    

数据占位符定义规范 DPD

占位符 只是在属性值字符串中占个位置,并不出现在最终的属性值中。

占位符 的格式为

@占位符
@占位符(参数 [, 参数])

注意:

  1. @ 来标识其后的字符串是 占位符
  2. 占位符 引用的是 Mock.Random 中的方法。
  3. 通过 Mock.Random.extend() 来扩展自定义占位符。
  4. 占位符 也可以引用 数据模板 中的属性。
  5. 占位符 会优先引用 数据模板 中的属性。
  6. 占位符 支持 相对路径绝对路径
Mock.mock({
    name: {
        first: '@FIRST',
        middle: '@FIRST',
        last: '@LAST',
        full: '@first @middle @last'
    }
})
// =>
{
    "name": {
        "first": "Charles",
        "middle": "Brenda",
        "last": "Lopez",
            "full": "Charles Brenda Lopez"
    }
}

Mock占位符语法

在平时的学习与工作当中,占位符语法使用场景比较多,我们现在列举占位符语法的详细信息

Mock.Random 是一个工具类,用于生成各种随机数据。Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) 。

内置方法列表

Type类型Method方法
Basicboolean, natural, integer, float, character, string, range, date, time, datetime, now
Imageimage, dataImage
Colorcolor
Textparagraph, sentence, word, title, cparagraph, csentence, cword, ctitle
Namefirst, last, name, cfirst, clast, cname
Weburl, domain, email, ip, tld
Addressarea, region
Helpercapitalize, upper, lower, pick, shuffle
Miscellaneousguid, id

基本方法

可以生成随机的基本数据类型:

  1. @boolean(num1?,num2?,current?)字符串方法

返回一个随机生成的boolean值

为current的概率为num1/(num1+num2)

Mock.mock('@boolean()')
Mock.mock('@boolean(1,9,true)')
  1. @natural(num1?,num2?)自然数方法

    返回一个介于num1和num2的自然数

    包含num1和num2

    只有一个参数时为最小值

    Mock.mock('@natural()')
    Mock.mock('@natural(100,99)')
    Mock.mock('@natural(10)')
    
  2. @integer(num1?,num2?)

    同Random.natural(num1?,num2?)

    区别:产生的整数可能是负数

    Mock.mock('@integer()')
    
  3. float(num1?,num2?,dnum1?,dnum2?)

    返回一个浮点数,整数部分介于num1和num2,小数部分的长度介于dnum1和dnum2

    包含num1、num2、dnum1、dnum2

    Mock.mock('@float()')
    Mock.mock('@float(1,100)')
    Mock.mock('@float(1,100,3,5)')
    Mock.mock('@float(1,100,3)')
    
  4. @character(pool?/type?)

    产生一个字符

    type可以为:lower(小写)、upper(大写)、number(数字)、symbol(符号),随机产生满足类型的一个字符

    pool:是一个字符串,返回的值是字符串的任一字符

    Mock.mock('@character()')
    Mock.mock('@character("lower")')
    Mock.mock('@character("Hello@1")')
    
  5. string(pool?/type?,num1?,num2?)

    产生一个字符串,长度在num1和num2之间

    type的规则同上,产生的是一个字符串。

    pool:会从pool这个字符串中随机选取规定个字符作为一个新的字符串

    当只有一个num1时,是按照规则生成num1个字符的字符串;

    当num1和num2都不存在时,生成的字符串为空 ""

    Mock.mock('@string()')
    Mock.mock('@string("lower",3,5)')
    Mock.mock('@string("qazwsxedc",3,5)')
    Mock.mock('@string("lower",3)')
    Mock.mock('@string("qazwsxedc")')
    Mock.mock('@string("number","4")')   //产生四个数的长度
    
  6. range(start,stop?,step?)

    生成一个数组,数组包含满足条件的数字,start必须存在

    当只有start和stop时,从start开始,到stop结束,但是不包括stop;长度为 stop-start

    当存在step时,从start开始,每次叠加时跳的步数不是1而是step,到stop结束,但不包括stop;长度为(stop-start)/step

    Mock.mock('@range(10)')
    Mock.mock('@range(10,50)')
    Mock.mock('@range(10,50,5)')
    

上面的几种是basic的常用方法,现在我们来试一下它的使用

let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        'id|+1': 1,
        'name':'@string',//字符串
        'point':'@integer',//整形
        'birthday':'@date',//日期
        'birthday2':'@datetime("yyyy-MM-dd")',
        'range':'@range(10,20,5)',
        "userid":"H1904@string('number',4)"
    }]
})

图像方法

image 随机生成图片地址

let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        'id|+1': 1,
        'name':'@string',
        'point':'@integer',
        'birthday':'@date',
        'pic':'@image'//随机生成图片地址
    }]
})

文本方法

  1. @title: 标题
  2. @cword(100):文本内容,参数为字数。
  3. @csentence(2,100):生成句子,最少2个字,最多100个字
  4. @cparagraph(2)生成段落
let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        'id|+1': 1,
        'name':'@string',
        'point':'@integer',
        'birthday':'@date',
        'pic':'@image',
        'title':'@title',//标题
        'content':'@cword(100)'//文本内容
    }]
})

名称方法

  1. cname :中文名称
  2. cfirst:中文姓氏
  3. Last:英文姓氏
let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        // 属性 id 是一个自增数,起始值为 1,每次增 1
        'id|+1': 1,
        'name':'@cname',
        'ename':'@last',
        'cfirst':'@cfirst',
        'point':'@integer',
        'birthday':'@date',
        'pic':'@image',
        'title':'@title',
        'content':'@cword(100)'
    }]
})

网络方法

可以生成url/ip/email等网络相关信息

let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        'id|+1': 1,
        'name':'@cname',
        'ename':'@last',
        'cfirst':'@cfirst',
        'point':'@integer',
        'birthday':'@date',
        'pic':'@image',
        'title':'@title',
        'content':'@cword(100)',
        'url':"@url",//url地址
        'ip':"@ip",//ip地址
        'email':"@email"//邮政
    }]
})

地址方法

  1. @region 区域
  2. @county 省市县
  3. @privince省
  4. @city市
let Mock = require('mockjs')
let data = Mock.mock({
    'list|10': [{
        'id|+1': 1,
        'name':'@cname',
        'ename':'@last',
        'cfirst':'@cfirst',
        'point':'@integer',
        'birthday':'@date',
        'pic':'@image',
        'title':'@title',
        'content':'@cword(100)',
        'url':"@url",
        'ip':"@ip",
        'email':"@email",
        'area':'@region',//区域
        'address':'@county(true)'//省市区
    }]
})
0

评论区