如何構(gòu)建 Web 前端 Mock Server

簡介:如何構(gòu)建 Web 前端 Mock Server

前后端分離
真實數(shù)據(jù)模擬
接口測試

前后端分離
讓前端攻城師獨立于后端進(jìn)行開發(fā)。 增加單元測試的真實性
通過隨機(jī)數(shù)據(jù),模擬各種場景。 開發(fā)無侵入
不需要修改既有代碼,就可以攔截 Ajax 請求,返回模擬的響應(yīng)數(shù)據(jù)。 用法簡單
符合直覺的接口。 數(shù)據(jù)類型豐富
支持生成隨機(jī)的文本、數(shù)字、布爾值、日期、郵箱、鏈接、圖片、顏色等。 方便擴(kuò)展

  • 相對于其他同類的框架的實現(xiàn),mock.js超出了我的意料。
    • 基于 數(shù)據(jù)模板 生成模擬數(shù)據(jù)。
    • 基于 HTML模板 生成模擬數(shù)據(jù)。
    • 攔截并模擬 ajax 請求。
  • 是的,mock.js只做上述的幾件事,但做的足夠出色。
    解決的問題
    開發(fā)時,后端還沒完成數(shù)據(jù)輸出,前端只好寫靜態(tài)模擬數(shù)據(jù)。
  • 數(shù)據(jù)太長了,將數(shù)據(jù)寫在js文件里,完成后挨個改url。
  • 某些邏輯復(fù)雜的代碼,加入或去除模擬數(shù)據(jù)時得小心翼翼。
  • 想要盡可能還原真實的數(shù)據(jù),要么編寫更多代碼,要么手動修改模擬數(shù)據(jù)。
  • 特殊的格式,例如IP,隨機(jī)數(shù),圖片,地址,需要去收集。
  • 超爛的破網(wǎng)速…

配置模擬數(shù)據(jù):
Mock.mock('http://g.cn', {
'name' : '@name',
'age|1-100': 100,
'color' : '@color'
});
發(fā)送Ajax請求:
$.ajax({
url: 'http://g.cn',
dataType:'json'
}).done(function(data, status, xhr){
console.log(
JSON.stringify(data, null, 4)
)
});
返回數(shù)據(jù):
// 結(jié)果1
{
"name": "Elizabeth Hall",
"age": 91,
"color": "#0e64ea"
}

// 結(jié)果2
{
"name": "Michael Taylor",
"age": 61,
"color": "#081086"
}

語法
Mock.js 的語法規(guī)范包括兩部分:

  1. 數(shù)據(jù)模板定義(Data Temaplte Definition,DTD)
  2. 數(shù)據(jù)占位符定義(Data Placeholder Definition,DPD)
    數(shù)據(jù)模板定義 DTD
    數(shù)據(jù)模板中的每個屬性由 3 部分構(gòu)成:屬性名、生成規(guī)則、屬性值:
    // 屬性名 name
    // 生成規(guī)則 rule
    // 屬性值 value
    'name|rule': value
    注意:
  • 屬性名 和 生成規(guī)則 之間用 | 分隔。
  • 生成規(guī)則 是可選的。
  • 生成規(guī)則 有 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
  • 生成規(guī)則 的 含義 需要依賴 屬性值 才能確定。
  • 屬性值 中可以含有 @占位符。
  • 屬性值 還指定了最終值的初始值和類型。
    生成規(guī)則和示例:
  1. 屬性值是字符串 String
  2. 'name|min-max': 'value' 通過重復(fù) 'value' 生成一個字符串,重復(fù)次數(shù)大于等于 min,小于等于 max。
  3. 'name|count': 'value' 通過重復(fù) 'value' 生成一個字符串,重復(fù)次數(shù)等于 count。
  4. 屬性值是數(shù)字 Number
  5. 'name|+1': 100 屬性值自動加 1,初始值為 100
  6. 'name|1-100': 100 生成一個大于等于 1、小于等于 100 的整數(shù),屬性值 100 只用來確定類型。
  7. 'name|1-100.1-10': 100 生成一個浮點數(shù),整數(shù)部分大于等于 1、小于等于 100,小數(shù)部分保留 1 到 10 位。 {
  8. 'number1|1-100.1-10': 1,
    
  9. 'number2|123.1-10': 1,
    
  10. 'number3|123.3': 1,
    
  11. 'number4|123.10': 1.123
    
  12. }
    
  13. // =>
    
  14. {
    
  15. "number1": 12.92,
    
  16. "number2": 123.51,
    
  17. "number3": 123.777,
    
  18. "number4": 123.1231091814
    
  19. }
    
  20. 屬性值是布爾型 Boolean
  21. 'name|1': value 隨機(jī)生成一個布爾值,值為 true 的概率是 1/2,值為 false 的概率是 1/2。
  22. 'name|min-max': value 隨機(jī)生成一個布爾值,值為 value 的概率是 min / (min + max),值為 !value 的概率是 max / (min + max)。
  23. 屬性值是對象 Object
  24. 'name|min-max': {} 從屬性值 {} 中隨機(jī)選取 min 到 max 個屬性。
  25. 'name|count': {} 從屬性值 {} 中隨機(jī)選取 count 個屬性。
  26. 屬性值是數(shù)組 Array
  27. 'name|1': [{}, {} ...] 從屬性值 [{}, {} ...] 中隨機(jī)選取 1 個元素,作為最終值。
  28. 'name|min-max': [{}, {} ...] 通過重復(fù)屬性值 [{}, {} ...] 生成一個新數(shù)組,重復(fù)次數(shù)大于等于 min,小于等于 max。
  29. 'name|count': [{}, {} ...] 通過重復(fù)屬性值 [{}, {} ...] 生成一個新數(shù)組,重復(fù)次數(shù)為 count。
  30. 屬性值是數(shù)組 Function
    'name': function(){} 執(zhí)行函數(shù) function(){},取其返回值作為最終的屬性值,上下文為 'name' 所在的對象。
    數(shù)據(jù)占位符定義 DPD
    占位符 只是在屬性值字符串中占個位置,并不出現(xiàn)在最終的屬性值中。占位符 的格式為:
    @占位符
    @占位符(參數(shù) [, 參數(shù)])
    注意:
  31. 用 @ 來標(biāo)識其后的字符串是 占位符。
  32. 占位符 引用的是 Mock.Random 中的方法。
  33. 通過 Mock.Random.extend() 來擴(kuò)展自定義占位符。
  34. 占位符 也可以引用 數(shù)據(jù)模板 中的屬性。
  35. 占位符 會優(yōu)先引用 數(shù)據(jù)模板 中的屬性{
  36. name: {
  37. first: '@FIRST',
  38. middle: '@FIRST',
  39. last: '@LAST',
  40. full: '@first @middle @last'
  41. }
    
  42. }
  43. // =>
  44. {
  45. "name": {
  46. "first": "Charles",
  47. "middle": "Brenda",
  48. "last": "Lopez",
  49. "full": "Charles Brenda Lopez"
  50. }
    
  51. }

常用方法
Mock.mock( rurl?, rtype?, template|function(options) )
根據(jù)數(shù)據(jù)模板生成模擬數(shù)據(jù)。
參數(shù)的含義和默認(rèn)值如下所示:

  • 參數(shù) rurl:可選。表示需要攔截的 URL,可以是 URL 字符串或 URL 正則。例如 //domain/list.json/、'/domian/list.json'。
  • 參數(shù) rtype:可選。表示需要攔截的 Ajax 請求類型。例如 GET、POST、PUT、DELETE 等。
  • 參數(shù) template:可選。表示數(shù)據(jù)模板,可以是對象或字符串。例如 { 'data|1-10':[{}] }、'@EMAIL'。
  • 參數(shù) function(options):可選。表示用于生成響應(yīng)數(shù)據(jù)的函數(shù)。
  • 參數(shù) options:指向本次請求的 Ajax 選項集。
    Mock.mockjax(library)
    覆蓋(攔截) Ajax 請求,目前內(nèi)置支持 jQuery、Zepto、KISSY。
    Mock.Random
    Mock.Random 是一個工具類,用于生成各種隨機(jī)數(shù)據(jù)。Mock.Random 的方法在數(shù)據(jù)模板中稱為“占位符”,引用格式為 @占位符(參數(shù) [, 參數(shù)]) 。
    Mock.tpl(input, options, helpers, partials)
    基于 Handlebars、Mustache 的 HTML 模板生成模擬數(shù)據(jù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 題目:前后端分離-獨立于后端的前端開發(fā)簡介:如何構(gòu)建 Web 前端 Mock Server 前后端分離真實數(shù)據(jù)模擬...
    神刀閱讀 1,203評論 0 0
  • 在很早以前公司里面就接入了rap在線管理接口文檔平臺,通過圖形化書寫接口文檔,給前端同事使用。但是之前也僅僅是用于...
    云楓隨筆閱讀 3,907評論 0 2
  • 一、為什么要模擬數(shù)據(jù)? 項目開發(fā)中,前端工程師需要依賴后端工程師的數(shù)據(jù)接口以及后端聯(lián)調(diào)環(huán)境。但是其實我們也可以根據(jù)...
    小小美呀閱讀 6,913評論 0 8
  • 六道輪回的眾生,根據(jù)有無色身、性情、以及所居住的器世間等等不同,又可以分為三界:欲界、色界、無色界。 所謂的欲界,...
    寶蓮葉子閱讀 1,190評論 0 1

友情鏈接更多精彩內(nèi)容