Mock摆脱后端拖拉(借鉴官网)(一)

mock是一个模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。mock有如下功能

  • 根据数据模板生成模板数据

  • 模拟ajax请求,生成请求数据

  • 基于html模板生成模拟数据

下载安装

npm install mockjs
//使用mock
var Mock = require('mockjs');
var mcok = Mock.mock({
...
})

mock的语法

mock的语法规范包含两层规范

  • 数据模板 (DTD)

  • 数据占位符 (DPD)

数据模板DTD

末班规则:‘name|rule’:value

  • name:属性名

  • rule:属性规则

  • value:属性值

属性名和规则之间用|隔开,规则是可以选的。 
一共七个rule

  1. ‘name|mix-max’:value

  2. 'name|count':value

  3. 'name|mix-max.dmix-dmax':value

  4. 'name|min-max.dcount':value

  5. 'name|count.dmin-dmax':value

  6. 'name|count.dcount':value

  7. 'name|+step':value

生成规则需要根据属性值的类型才能确定 
属性值可以含有@占位符 
属性值还可以指定最终值的初始值和类型

属性值是String

var data = Mock.mock({
'name1|1-3':'a', //重复生成1到3个a
'name2|2':'b' //生成bb
})

属性值是Number

var data = Mock.mock({
'name1|+1':4, //生成4,如果循环每次加1
‘name2|1-7':2, //生成一个数字,1到7之间
'name3|1-4.5-8':1
//生成一个小数,整数部分1到4,小数部分5到8位
})

注意第三个是小数点之后的数位范围,另外其实属性值是Number的时候,value没什么用。

属性值是Boolean

var data = Mock.mock({
'name|1':true, //生成一个布尔值,各一半
'name1|1-3':true //1/4是true,3/4是false
})

属性值是Object

var obj = {
a:1,
b:2,
c:3,
d:4
}
var data = Mock.mock({
'name|1-3':obj, //随机从obj中寻找1到3个属性,新对象
'name|2':obj //随机从onj中找到两个属性,新对象
})

属性值是Array

var arr = [1,2,3];
var data = Mock.mock({
'name1|1':arr, //从数组里随机取出1个值
'name2|2':arr, //数组重复count次,这里count为2
'name3|1-3':arr, //数组重复1到3次
})

属性值是Function

var fun = function(x){
return x+10;
}
var data = Mock.mock({
'name':fun(10) //返回函数的返回值20
})

属性值为RegExp

根据正则表达式反向生成对应的字符串,用于生成自定义格式的字符串

var data = Mock.mock({
‘name1':/[a-z][A-Z]/,
'name2':/\d{1,3}/
})

会根据各自的正则表达式进行适配,并且随机返回

数据占位符DPD

关于占位符,占位符只是在属性值是字符串的时候,在字符串里占个位置,并不会出现在最终的属性值中。 
占位符的格式为:

@占位符

关于占位符需要知道以下几点

  1. 用@标识符标识后面的字符串是占位符

  2. 占位符的值是从Mock.Random方法中引用的

  3. 可以通过Mock.Random.extend()来扩展自定义占位符

  4. 占位符可以引用数据模板中的属性

  5. 占位符优先引用数据模板中的属性

  6. 占位符支持相对路径和决定路径

var data = Mock.mock({
name:{
name1:'@FIRST',
name2:'@LAST'
}
})

语法大概是这样,random会重点分析的。

Mock.mock()

这是mock的核心方法,用于生成模拟数据,前边的例子中我们都已经见识过了。 
Mock.mock(rurl?,rtype?,template|function(opt))

  • rurl:ajax请求的地址

  • rtype:ajax请求的类型,如’GET','POST'

  • template:数据模板,就是之前那些个例子

  • function:生成相应数据的函数

具体的应用情况在下边:

  1. Mock.mock(template)

  2. Mock.mock(rurl,template),模拟ajax,匹配接收到url的ajax请求,把template对应的数据返回返回

  3. Mock.mock(rurl,function(opt)),模拟ajax,会把函数执行的结果作为ajax回调返回

  4. Mock.mock(rurl,rtype,template) 同上,只是对ajax的类型有要求

  5. Mock.mock(rurl,rtype,function) 同上

Mock.setup(setting)

配置拦截ajax请求的行为,支持的配置项有timeout。

Mock.setup({
timeout:200
})
Mock.setup({
timeout:'200-500
})

这个现在仅用于配置ajax请求,以后可能会扩展

Mock.valid(template,data)

这个函数用来判断,数据模板和数据是否一样,

Mock.toJSONShema(template)

var template = Mock.mock({
'name|1-3':5
})
var tjs = Mock.toJSONSchema(tempalte);

把template风格的模板转成JSON Schema。具体的结果,自己看吧,不贴了。


接下来是最后一个方法

Mock.Random

这是一个工具类,用于生成各种类型的数据。 
Mock.Random的方法在模板数据中被称为占位符,之前说过的

用法示例:

var Random = Mock.Random;
var em1 = Mock.email();
var em2 = Mock.mock('@email');
var em3 = Mock.mock({
email:'@email'
})

Mock.Random提供的完成方法

Type Method
Basic boolean natural integer float character string date datename now
Date date datetime time now
Image image dataImage
Color color hex rgb rgba hsl
Text paragraph sentence word title cparagraph csentence cword ctitle
Name first last name cfirst clast cname
Web url domain email ip tld
Address area region city county zip
Helper capitalize upper lower pick shuffle
Miscellaneous guid id

Basic

Random.boolean(min?max?current?)

随机生成布尔值

var bool1 = Random.boolean();      //true false各一半
var bool2 = Random.boolean(1,2,false) //1/3的可能性是false 2/3是true

Random.natural(min?,max?)

随机生成一个自然数,什么叫自然数,就是大于等于0的

var natural1 = Random.natural();       //默认值最大为 9007199254740992
var natural2 = Random.natural(4); //随机出来的最小值是4
var natural3 = Random.natural(6,9);

Random.Integer(min?,max?)

生成一个随机的整数,可以是负数。

var integer1 = Random.integer();
var integer2 = Random.integer(-10); //随机最小值是-10
var integer3 = Random.integer(-10,20);

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

随机生成一个小数浮点数,四个参数分别为,整数部分最小值最大值,小数部分最小值最大值。

var float1 = Random.float();
var float2 = Random.float(3,8);
var float3 = Random.float(1,3,5,7)

Random.character(pool?)

随机生成一个字符,pool的值可以是:

  • upper: 26个大写字母

  • lower: 26个小写字母

  • number: 0到9十个数字

  • sympol: "!@#$%^&*()[]"

var character1 = Random.character();
var character2 = Random.character('lower');
var character3 = Random.character('upper');
var character4 = Random.character('symbol');

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

随机生成一个字符串,pool的值同上边四个。

var str1 = Random.string();                //长度3到7位
var str2 = Random.string(5); //长度5位
var str3 = Random.string('lower',7); //长度7位,小写
var str4 = Random.string(4,6); //长度4到
var str5 = Random.string('新的字符串会从这里选择4到5位',4,6); //从第一个参数里选择4到5位

Random.range(start?,stop,step?)

返回一个整型数组

  • start,可选,数组起始值,闭区间

  • stop,必选,数据结束值,开区间

  • step,可选,数据每一项间隔值

var range1 = Random.range(10);     //[0,1,2,3,4,5,6,7,8,9]
var range2 = Random.range(14,20); //[14,15,16,17,18,19]
var range3 = Random.range(3,13,2); //[3,5,7,9,11]

Date

Random.date(format?)

返回一个随机日期的字符串 
format的格式是‘yyyy-MM-dd’,可以随机组合

var date1 = Random.date();
var date2 = Random.date('yyyy-MM-dd');
var date3 = Random.date('y-M-d');
var date4 = Random.date('yy-MM-dd');

Random.time(format?)

返回时间字符串
format的格式是‘HH-mm-ss’

var time1 = Random.time();
var time2 = Random.time('HH-mm-ss');
var time3 = Random.time('J-m-s');

Random.datetime(format?)

上边两个的结合版

var dt1 = Random.datetime();
var dt2 = Random.datetime('yyyy-MM-dd HH-mm-ss');

Random.now(unit?,format?)

返回当前时间的字符串

Image

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

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

  • size 图片宽高,格式是'宽x高'

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

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

  • format:图片的格式,默认'.png'

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

其中size的取值范围是

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

图片的格式可以选择.png .gif .jpg

var image1 = Random.image();
var image2 = Random.image('128x90');
var image3 = Random.image('120x660','#ccc'); //前景色#ccc
var image4 = Random.image('226x280','#eee','第三个参数是文字不是前景色');
var image5 = Random.image('66x31','#ddd','#123456','四个参数的时候第三个参数是前景色');
var image6 = Random.image('240x400','#333','#1483dc','.gif','全部参数的情况下');

Random.dataImage(size?,text?)

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

var di1 = Random.dataImage();
var di2 = Random.datImage('300x600');
var di3 = Random.dataImage('180x150','hahahaha');

Color

Random.color()

有好几个相关的方法

var color = Random.color(); 格式'#rrggbb'
var hex = Random.hex(); //好像和color没什么不同
var rgb = Random.rgb(); //生成格式如rgb(133,233,244)
var rgba = Random.rgba(); //生成个事如rgba(111,222,233,0.5)
var hsl = Random.hsl(); //生成格式(345,82,71)

Text

Random.paragraph(in?,max?,len?)

随机生成一段文本,

var para1 = Random.paragraph();    //随机生成一短文本,范围3到7
var para2 = Random.paragraph(10); //随机生成长度是10的文本
var para3 = Random.paragraph(9,12); //随机生成9到11位长度的文本

Random.sentence(min?,max?,len?)

随机生成一个句子,第一个单词的首字母大写

var sen1 = Random.sentence();        //默认长度12到18
var sen2 = Random.sentence(10); //随机生成一个单词个数为10的句子
var sen3 = Random.sentence(5,10); //随机生成一个5到9单词个数的句子

Random.word(min?,max?,len?)

随机生成一个单词

var word1 = Random.word();          //默认长度3到10
var word2 = Random.word(7); //随机生成长度是7的单词
var word3 = Random.word(2,12); //随机生成2到11位长度的单词

Random.title(min?,max?,len?)

随机生成一段标题,每个单词的首字母大写

var title1 = Random.title();        //title中的单词个数
var title2 = Random.title(6); //title六个单词
var title3 = Random.title(7,12); //title7到11个单词

另外还有四个方法,四个方法前边加一个

c,Random.cparagraph, 返回中文文本

Random.csentence, 返回中文句子

Random.cword, 返回中文文字

Random.ctitle. 返回中文标题

Name

var first = Random.first()         随机生成常见英文名
var last = Random.last() 随机生成常见英文姓
var name = Random.name() 随机生成常见英文姓名
var cfirst = Random.cfirst() 随机生成常见中文姓
var clast = Random.clast() 随机生成常见中文名
var cname = Random.cname() 随机生成一个常见中文姓名

Web

Random.url(protocol?,host?)

随机生成一个url 
protocol可选参数,表示网络协议,如http。 
host表示域名和端口号

var url1 = Random.url();
var url2 = Random.url('http');
var url3 = Random.url('http','58.com');

Random.protocol()

随机生成一个域名

var protocol = Random.protocol()

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

Random.domin()

随机生成一个域名

Random.tld()

随机生成一个*域名

var domain = Random.domain()
var tld = Random.tld()

Random.email(domain?)

随机生成一个email地址,domain表示域名

var email1 = Random.email();
var email2 = Random.email('58.com') //生成xxxx@58.com

Random.ip()

随机生成一个ip地址

var ip = Random.ip()

Address

Random.region()

随机生成一个中国的大区,如华北,西南

var region = Random.region();

Random.province()

随机生成一个中国省直辖市自治区特别行政区

var province = Random.province()

Random.city(prefix?)

随机生成一个中国城市,prefix布尔值,表示是否标注所在省

var city1 = Random.city();
var city2 = Random.city(ture);

Random.country(prefix?)

随机生成一个中国县,prefix布尔值,表示是否显示所属的省市

var county1 = Random.county();
var county2 = Random.county(ture);

Random.zip()

随机生成一个六位数邮政编码

var zip = 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 arr = [1,4,5,6,7,8];
var pick = Random.pick(arr);

Random.shuffle(arr);

打乱数组的顺序并返回

var arr  = [1,2,3,4,6];
var shuffle = Random.shuffle(arr);

Miscellaneous

Random.guid()

随机生成一个GUID

Random.id()

随机生成一个18位身份证id

var guid = Random.guid();
var id = Random.id();

参考文档

官方网站
github资料
在线测试

上一篇:如何解决js递归里面出现的堆栈溢出


下一篇:虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。