mock.js

Mock

安装

生成随机数据,模拟ajax请求

# 安装

npm install mockjs

# 引用

import Mock from 'mockjs' 或者 let Mock = require('mockjs')

let mock = Mock.mock()


语法规范

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

数据模板定义规范(Data Template Definition,DTD)

数据占位符定义规范(Data Placeholder Definition,DPD)


数据模板定义规范DTD

// 属性名name,生成规则 rule,属性值value

'name|rule': value

注意:

1.属性名和生成规则之间用竖线 |分隔。

2.生成规则是可选的。

3.生成规则有 7 种格式:

'name|min-max': value

'name|count': value

'name|min-max.dmin-dmax': value

'name|min-max.dcount': value

'name|count.dmin-dmax': value

'name|count.dcount': value

'name|+step': value

4.生成规则的 含义 需要依赖 属性值的类型 才能确定。

5.属性值中可以含有 @占位符。

6.属性值还指定了最终值的初始值和类型。


生成规则和示例:

1.属性值是字符串String

(1)'name|min-max': string

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

(2)'name|count': string

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

    let strData = Mock.mock({

      'name1|3-6':'a', // 随机生成重复a3-6次的字符串

      'name2|2':'b', // 生成重复b2次的字符串

    })


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,小数部分保留dmin到 dmax 位。

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': value

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

    let booleanData = Mock.mock({

      'name1|1':true, // 生成一个布尔值,出现次数各一半

      'name2|1-3':true // 1/4是true,3/4是false

    })


4. 属性值是对象Object

(1)'name|count': object

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

(2)'name|min-max': object

从属性值 object中随机选取 min 到 max 个属性。


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

(1) '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()

Mock.mock( rurl?, rtype?, template|function( options ) )

Mock.mock(template)

根据数据模板生成模拟数据。

Mock.mock(rurl,template|function( options ) )

当拦截到匹配 rurl的 Ajax 请求时,将根据数据模板 template 生成模拟数据,并作为响应数据返回,或函数 function(options)将被执行,并把执行结果作为响应数据返回。

Mock.mock(rurl,rtype,template|function(options))

当拦截到匹配 rurl和 rtype 的 Ajax 请求时,将根据数据模板 template 生成模拟数据,并作为响应数据返回,或函数 function(options)将被执行,并把执行结果作为响应数据返回。

let data = Mock.mock('/demo','get',{

      'list|5':[{

        'id|+1':1, //从1开始循环按顺序增加step

        name:'@cname',

        email:'@email',

        flag:'@boolean',

        date:'@datetime',

        age:'@natural(1,100)',

        info:'@csentence',

        address:'@county(true)',

        'xingzuo|+1':arr //从arr数组里按顺序拿

      }]

})

    this.$axios.get('/demo').then(res=>{

      console.log(res)

    })


Mock.setup()

Mock.setup(settings)

配置拦截Ajax请求时的行为。支持的配置项有:timeout

指定被拦截的Ajax请求的响应时间,单位是毫秒。默认值是'10-100'。

Mock.setup({

    timeout: 400

})

Mock.setup({

    timeout: '200-600'//响应事件介于200和600毫秒之间

})


Mock.Random

Mock.Random是一个工具类,用于生成各种随机数据。

Mock.Random的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数])。


    let data = Mock.mock('/demo','get',{

      name:'@cname',

      email:'@email',

      flag:'@boolean',

      date:'@datetime',

      age:'@natural(1,100)',

      info:'@csentence',

      address:'@county(true)'

    })


Basic

(1)Mock.Random.boolean(min?,max?,current?) 

随机生成布尔值


      flag1:Mock.Random.boolean(), // true,false各一半

      falg2:Mock.Random.boolean(1,2,false), // 1/3的可能性false


(2)Mock.Random.natural(min?,max?) 

随机生成自然数min-max之间,默认值最大为 900719925474099

(3)Mock.Random.integer(min?,max?) 

随机生成整数min-max之间

(4)Mock.Random.float(min?,max?,dmin?,dmax?)

随机生成小数浮点数

(5)Mock.Random.character(pool?)

随机生成一个字符,参数可以不填,可以是'upper'(26个大写字母)、'lower'(26个小写字母)、'number'(0-9十个数字)、'!@#$%^&*()[]'

(6)Mock.Random.string(pool?,min?,max?) 

随机生成一个字符串,pool如上,字符串长度min-max

(7)Mock.Random.range(start?,stop,strp?) 

返回一个整数数组,start数组起始值(闭区间),stop数组结束值(开区间),step为数据每一项间隔值


Date

(1)date日期

(2)time时间

(3)datetime日期时间

      data:Mock.Random.date(format?) //随机生成日期字符串,参数默认'yyyy-MM-dd'

      time:Mock.Random.time(format?) //随机生成时间字符串,参数默认'HH-mm-ss'

      datetime:Mock.Random.datetime(format?) //随机生成日期时间字符串,参数默认'yyyy-MM-dd HH-mm-ss'


Image

(1) image

(2) dateImage

//一般情况下,使用dataImage更好,因为更简单,但是如果要生成高度自定义的图片,则最好用image。另外,dataImage生成的是base64编码

image:Mock.Random.image(size?,background?,foreground?,format?text?) 

// 返回一段base64编码,两个参数同上

      dataImage:Mock.Random.dataImage(size?,text?) 

// 参数说明

      size 图片宽高,格式是'宽x高',取值

      ['300x250', '250x250', '240x400', '336x280', '180x150', '720x300', '468x60', '234x60', '88x31', '120x90', '120x60', '120x240', '125x125', '728x90', '160x600', '120x600', '300x600']

      background:图片的背景色,默认值#000000

      foreground:图片的文字前景色,默认#FFFFFF

      format:图片的格式,默认'.png',可以选择.png,.gif,.jpg

      text:图片上的默认文字,默认值为参数size


Color

      color:Mock.Random.color() //格式格式'#rrggbb'

      Mock.Random.hex()  //好像和color没什么不同

      Mock.Random.rgb()  //生成格式如rgb(133,233,244)

      Mock.Random.rgba() //生成格式如rgba(111,222,233,0.5)

      Mock.Random.hsl() //生成格式如(345,82,71)


Text

(1)paragraph文本

      paragraph=Mock.Random.paragraph(min?,mix?,len?) // 随机生成长度[min,max)的文本

(2)sentence句子

      sen:Mock.Random.sentence(min?,max?,len?) // 随机生成一个有[min,max)单词个数的句子,首字母大写

      sen1:Random.sentence()       //默认长度12到18

      sen2:Random.sentence(10)      //随机生成一个单词个数为10的句子

      sen3:Random.sentence(5,10)    //随机生成一个5到9单词个数的句子

(3)word单词

      word:Mock.Random.word(min?,max?,len?) //随机生成一个单词

      word1:Mock.Random.word()        //默认长度3到10

      word2:Mock.Random.word(7)        //随机生成长度是7的单词

      word3:Mock.Random.word(2,12)     //随机生成2到11位长度的单词

(4)title标题

      title:Mock.Random.title(min?,max?,len?) //随机生成一段标题,每个单词的首字母大写

(5)cparagraph、csentence、cword、ctitle中文文本句子单词标题

      Random.cparagraph, 返回中文文本

      Random.csentence, 返回中文句子

      Random.cword, 返回中文文字

      Random.ctitle. 返回中文标题


Name

(1) first

(2) last

(3) name

(4) cfirst

(5) clast

(6)cname

      let first = Random.first()         随机生成常见英文名

      let last = Random.last()           随机生成常见英文姓

      let name = Random.name()           随机生成常见英文姓名

      let cfirst = Random.cfirst()       随机生成常见中文姓

      let clast = Random.clast()         随机生成常见中文名

      let cname = Random.cname()         随机生成一个常见中文姓名


Web

      Random.url(protocol?,host?) //随机生成一个url,var url3 = Random.url('http','58.com')

      Random.protocol() //随机生成一个协议

      protocol可以选的值'http'、'ftp'、'gopher'、'mailto'、'mid'、'cid'、'news'、'nntp'、'prospero'、'telnet'、'rlogin'、'tn3270'、'wais'。


      Random.domin() //随机生成一个域名

      Random.ip() // 随机生成一个ip地址

      Random.tld() //随机生成一个顶级域名

      Random.email(domain?) //随机生成一个email地址,domain表示域名

      let email2 = Random.email('58.com')     //生成xxxx@58.com


Address

      Random.region() //随机生成一个中国的大区,如华北,西南

      Random.province() //随机生成一个中国省直辖市自治区特别行政区

      Random.city(prefix?) //随机生成一个中国城市,prefix布尔值,表示是否标注所在省

      Random.county(prefix?) //随机生成一个中国县,prefix布尔值,表示是否显示所属的省市

      Random.zip() //随机生成一个六位数邮政编码


Helper

      Random.capitlize(word) //把第一个字母转成大写,var capitalize = Random.capitalize('hello')

      Random.upper(str) //转成大写,var upper = Random.upper('zhang')

      Random.lower(str) //转成小写,var lower = Random.lower('JINGWEI');

      Random.pick(arr) //从数组中随机选取一个元素,var pick = Random.pick(arr);

      Random.shuffle(arr); //打乱数组的顺序并返回


Miscellaneous

      Random.guid() // 随机生成一个GUID,var guid = Random.guid()

      Random.id() // 随机生成一个18位身份证id,var id = Random.id()




扩展Mock.Random.extend()

    Mock.Random.extend({

      constellation:function(date){

        let arr=['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']

        return this.pick(arr)

      }

    })


Random.constellation()

// => "水瓶座"

Mock.mock('@CONSTELLATION')

// => "天蝎座"

Mock.mock({

    constellation: '@CONSTELLATION'

})

// => { constellation: "射手座" }


Mock.valid(template,date)

校验真实数据 data是否与数据模板 template 匹配。


Mock.toJSONSchema( template )

把Mock.js风格的数据模板 template转换成 JSON Schema


参考文档

mock官方文档https://github.com/nuysoft/Mock/wiki

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270