Mock.js數據生成器的使用


1、Mock.js數據生成器

1.1 解決什么問題

問題:

前后端分離項目,前端和后端人員都是根據API文檔進行項目開發的,不應該直接相互依賴,前端人員不應該等待后端開發好接口再進行測試,既然不依賴后端接口,那么前端人員應該如何測試呢?

解決:

可以通過模擬數據生成器,通過一定規則(API文檔)生成模擬數據接口,提供給前端人員測試。

1.2 什么是Mock.js

  • 官網:http://mockjs.com

  • 文檔:https://github.com/nuysoft/Mock/wiki

  • Mock.js可以生成隨機數據,攔截Ajax請求。

  • 通過攔截Ajax請求,根據模板生成並返回模擬數據,讓前端人員獨立於后端人員進行,幫助編寫單元測試。

  • Mock.js的作用:

    1. 前后端分離

      讓前端開發人員獨立於后端進行開發。

    2. 增加單元測試的真實性

      通過生成隨機模擬數據,模擬各種場景。

    3. 開發無入侵

      不需要修改既有代碼,就可以攔截Ajax請求,返回模擬的響應數據。

    4. 用法簡單

      符合直覺的接口。

    5. 數據類型豐富

      支持隨機生成文本、數字、布爾值、日期、郵箱、鏈接、圖片、顏色等等。

    6. 方便拓展

      支持拓展更多數據類型,支持自定義函數和正則。

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"
    }
  ]
}

編碼實現:

  1. 新建E:\Gogs\VueProject\mockjs-demo目錄,通過命令提示符窗口進入該目錄,初始化項目。

    npm init -y
    
  2. 安裝Mock.js

    npm install mockjs
    
  3. 新建demo1.js,代碼如下:

    const Mock = require('mockjs')
    const data = Mock.mock({
        //定義數據生成規則
        'menberList|4': [{
            'id': 1,
            'name': 'staryjie'
        }]
    })
    
    console.log(JSON.stringify(data, null, 2))
    
  4. 運行該文件,查看效果

    node .\demo1.js
    

1.4.2 語法規則

  • Mock.js的語法規范包括兩部分
    1. 數據模板定義規范(Data Template Definition,DTD)
    2. 數據占位符定義規范(Data Placeholder Definition, DPD)

1.5 數據模板定義規范 DTD

數據模板中的每個屬性由3部分構成:屬性名、生成規則、屬性值:

// '屬性名|生成規則': 屬性值
'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.5.1 屬性值是字符串 String

  1. 'name|count': string,通過重復string生成一個字符串,重復次數等於``count`。
  2. '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

  1. 'name|+1': number,屬性值自動加1,初始值為``number`。
  2. 'name|min-max': number,生成一個大於等於min、小於等於max的整數,屬性值number只是用來確定值的類型。
  3. 'name|min-max.dmin-dmax': number,生成一個浮點數,整數部分大於等於min 、小於等於max,小數部分保留 dmindmax 位。

代碼:

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

  1. 'name|1': boolean,隨機生成值為true或者false,兩者概率都是1/2。
  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

  1. 'name|count': object, 從屬性值object中隨機選取count個屬性。
  2. 'name|min-max': object,從屬性object中隨機挑選minmax個值。

代碼:

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

  1. 'name|min-max': array,通過重復屬性值array生成一個新數組,重復次數大於等於min,小於等於max
  2. '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

  1. '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 基本類型占位符

  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 日期占位符

  1. 隨機生成日期類型的數據

    常用占位符:

    • 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 圖像占位符

  1. 隨機生成圖片地址,生成的地址在瀏覽器可以正常打開。

    占位符:

    • 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 文本占位符

  1. 隨機生成一段文本

    占位符:

    • 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 名稱占位符

  1. 隨機生成名稱。

    占位符:

    • 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 網絡占位符

  1. 隨機生成URL、域名、IP地址、郵件地址

    占位符:

    • url(protocol?, host?) 生成url
      • protocol:協議,如http
      • host:域名和端口號,如staryjie.com
    • domain 生成域名
    • ip 生成IP
    • email 生成email地址
  • 代碼:

    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 地址占位符

  1. 隨機生成區域、省市縣、郵政編碼

    占位符:

    • 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))
    
  • 執行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM