Mock.js資料生成器的使用
1、Mock.js資料生成器
1.1 解決什麼問題
問題:
前後端分離專案,前端和後端人員都是根據API文件進行專案開發的,不應該直接相互依賴,前端人員不應該等待後端開發好介面再進行測試,既然不依賴後端介面,那麼前端人員應該如何測試呢?
解決:
可以通過模擬資料生成器,通過一定規則(API文件)生成模擬資料介面,提供給前端人員測試。
1.2 什麼是Mock.js
-
Mock.js可以生成隨機資料,攔截Ajax請求。
-
通過攔截Ajax請求,根據模板生成並返回模擬資料,讓前端人員獨立於後端人員進行,幫助編寫單元測試。
-
Mock.js的作用:
-
前後端分離
讓前端開發人員獨立於後端進行開發。
-
增加單元測試的真實性
通過生成隨機模擬資料,模擬各種場景。
-
開發無入侵
不需要修改既有程式碼,就可以攔截Ajax請求,返回模擬的響應資料。
-
用法簡單
符合直覺的介面。
-
資料型別豐富
支援隨機生成文字、數字、布林值、日期、郵箱、連結、圖片、顏色等等。
-
方便拓展
支援拓展更多資料型別,支援自定義函式和正則。
-
1.3 安裝Mock.js
通過npm
命令就可以安裝Mock.js:
npm install mockjs
1.4 入門案例與語法規範
1.4.1 入門案例
需求:生成4條列表資料。
效果如下:
{ "menberList": [ { "id": 1, "name": "staryjie" }, { "id": 1, "name": "staryjie" }, { "id": 1, "name": "staryjie" }, { "id": 1, "name": "staryjie" } ] }
編碼實現:
-
新建
E:\Gogs\VueProject\mockjs-demo
目錄,通過命令提示符視窗進入該目錄,初始化專案。npm init -y
-
安裝Mock.js
npm install mockjs
-
新建
demo1.js
,程式碼如下:const Mock = require('mockjs') const data = Mock.mock({ //定義資料生成規則 'menberList|4': [{ 'id': 1, 'name': 'staryjie' }] }) console.log(JSON.stringify(data, null, 2))
-
執行該檔案,檢視效果
node .\demo1.js
1.4.2 語法規則
- Mock.js的語法規範包括兩部分
- 資料模板定義規範(Data Template Definition,DTD)
- 資料佔位符定義規範(Data Placeholder Definition, DPD)
1.5 資料模板定義規範 DTD
資料模板中的每個屬性由3部分構成:屬性名、生成規則、屬性值:
// '屬性名|生成規則': 屬性值
'name|rule': value
注意:
- 屬性名和生成規則之間通過豎線
|
分隔。 - 生成規則是可選的,生成規則有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
- 生成規則的含義需要依賴屬性值的型別才能定。
- 屬性值中可以含有
@佔位符
。 - 屬性值指定了最終值的初始值和型別。
1.5.1 屬性值是字串 String
'name|count': string
,通過重複string
生成一個字串,重複次數等於``count`。'name|min-max': value
,通過重複string
生成一個字串,重複次數大於等於min
,小於等於max
。
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
//定義資料生成規則
'menberList|4': [{
'id': 1,
'name|1-3': 'staryjie', // 隨機生成生成1-3個staryjie
'phone|11': '8', // String生成11個8
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.2 屬性值是數字 Number
'name|+1': number
,屬性值自動加1,初始值為``number`。'name|min-max': number
,生成一個大於等於min
、小於等於max
的整數,屬性值number
只是用來確定值的型別。'name|min-max.dmin-dmax': number
,生成一個浮點數,整數部分大於等於min
、小於等於max
,小數部分保留dmin
到dmax
位。
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重複'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.3 屬性值是布林型 Boolean
'name|1': boolean
,隨機生成值為true
或者false
,兩者概率都是1/2。'name|min-max': value
,隨機生成一個布林值,值為value
的概率為min / (min + max)
,值為!value
的概率為max / (min + max)
。
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重複'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
'status|1': true, // Boolean,生成true或false的概率都是1/2。
'open|2-4': true, // Boolean,生成true的概率是2/(2+4),生成false的概率是4/(2+4)
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.4 屬性值是物件 Object
'name|count': object
, 從屬性值object
中隨機選取count
個屬性。'name|min-max': object
,從屬性object
中隨機挑選min
到max
個值。
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重複'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
'status|1': true, // Boolean,生成true或false的概率都是1/2。
'open|2-4': true, // Boolean,生成true的概率是2/(2+4),生成false的概率是4/(2+4)
'order|2': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2-3個屬性進行返回
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.5 屬性值是陣列 Array
'name|min-max': array
,通過重複屬性值array
生成一個新陣列,重複次數大於等於min
,小於等於max
。'name|count': array
,通過重複屬性值array
生成一個新陣列,重複次數為count
。
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|2-5': [{ // Array,隨機生成2-5個數組中的元素
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重複'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
'status|1': true, // Boolean,生成true或false的概率都是1/2。
'open|2-4': true, // Boolean,生成true的概率是2/(2+4),生成false的概率是4/(2+4)
'order|2': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2-3個屬性進行返回
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.6 值是正則表示式 RegExp
'name': regexp
,根據正則表示式regexp
反向生成可以匹配它的字串。用於生成自定義格式的字串。
注意:regexp是沒有引號的
程式碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重複'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
'status|1': true, // Boolean,生成true或false的概率都是1/2。
'open|2-4': true, // Boolean,生成true的概率是2/(2+4),生成false的概率是4/(2+4)
'order|2': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在物件中隨機抽取2-3個屬性進行返回
'idCard': /\d{15}|\d{18}/ // 隨機生成15位或者18位的身份證號碼
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.6 資料佔位符定義規範 DPD
Mock.Random是一個工具類,用於生成各種隨機資料。
Mock.Random類中的方法在資料模板中成為{佔位符},書寫格式為@佔位符(引數 [, 引數])
。
佔位符的格式為:
'屬性名': @佔位符
Mock.Random類中提供的完整方法(佔位符)如下:
Type(型別) | Method(佔位符) |
---|---|
Basic | boolean , natural (自然數,大於等於 0 的整數), integer , float , character , string , range (整型陣列) |
Date | date (年月日), time (時分秒), datetime (年月日時分秒) |
Image | image, dataImage |
Color | color |
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 |
Miscellaneous | guid, id |
1.6.1 基本型別佔位符
-
隨機生成基本資料型別的資料
常用佔位符:
- natural
- integer
- string
- float
- boolean
-
程式碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|3': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.2 日期佔位符
-
隨機生成日期型別的資料
常用佔位符:
- date/date(format)
- time/time(format)
- datetime/datetime(format)
-
程式碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|3': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.3 影象佔位符
-
隨機生成圖片地址,生成的地址在瀏覽器可以正常開啟。
佔位符:
- image
-
程式碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|3': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss 'pic': '@image', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.4 文字佔位符
-
隨機生成一段文字
佔位符:
- ctitle 隨機生成一句中文標題
- csentence(mix?, max?) 隨機生成一段中文文字
-
程式碼
const Mock = require('mockjs') const data = Mock.mock({ 'empList|3': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss 'pic': '@image', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文字(8到12個字) }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.5 名稱佔位符
-
隨機生成名稱。
佔位符:
- first 英文名
- last 應為姓
- name 英文姓名
- cfirst 中文名
- clast 中文姓
- cname 中文姓名
-
程式碼
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss 'pic': '@image', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文字(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.6 網路佔位符
-
隨機生成URL、域名、IP地址、郵件地址
佔位符:
- url(protocol?, host?) 生成url
- protocol:協議,如
http
- host:域名和埠號,如
staryjie.com
- protocol:協議,如
- domain 生成域名
- ip 生成IP
- email 生成email地址
- url(protocol?, host?) 生成url
-
程式碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss 'pic': '@image', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文字(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', 'url': '@url("https", "api.staryjie.com")', 'domain': '@domain', 'ip': '@ip', 'email': '@email', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.7 地址佔位符
-
隨機生成區域、省市縣、郵政編碼
佔位符:
- region 區域。如:華南。
- county(true) 省市縣。
- zip 郵政編碼。
-
程式碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ 'id|+1': 1, 'name': '@string', 'price': '@float', 'status': '@boolean', 'birthday': '@date', // 預設 yyyy-MM-dd 'entryDate': '@date("yyyy/mm/dd")', // 指定日期格式 yyyy/MM/dd 'createDate': '@datetime', // // 預設 yyyy-MM-dd HH:mm:ss 'updateDate': '@datetime("yyyy/mm/dd HH:mm:ss")', // 指定格式為 yyyy/MM/dd HH:mm:ss 'pic': '@image', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文字(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', 'url': '@url("https", "api.staryjie.com")', 'domain': '@domain', 'ip': '@ip', 'email': '@email', 'area': '@region', 'address': '@county(true)', 'zipcode': '@zip', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果: