武装少女在线观看高清完整版免费,丝袜+亚洲区,少妇被cao高潮呻吟声,午夜伦情电午夜伦情电影,日日躁夜夜躁狠狠躁

小程序模板網(wǎng)

論如何進(jìn)行小程序自定義組件的單元測試

發(fā)布時間:2018-12-12 09:04 所屬欄目:小程序開發(fā)教程

前言

自從小程序自定義組件和 npm 功能面世之后,組件化和開源思想逐步開始萌芽了。我們可以將一些通用的部件,如自定義導(dǎo)航欄之類的封裝到一個自定義組件中,然后借由 npm 平臺開源出去給其他開發(fā)者使用,這樣可以省去很多勞動。相信各位開發(fā)老爺們應(yīng)該或多或少都有過使用開源包的經(jīng)歷,但是在使用前,這個開源包得能贏取我們的信任,一個很重要的指標(biāo)就是單元測試通過率和覆蓋率。

但是因為小程序獨特的運行環(huán)境和不完全開源的基礎(chǔ)款,使得對小程序自定義組件的單元測試稍微有點困難。目前市面上無論是 vue 還是 react,這些組件化框架都有一套完善的單元測試解決方案,但是對于小程序自定義組件來說卻寥寥無幾,因此這個工具集—— miniprogram-simulate 便應(yīng)運而生了。

痛點

閑話不多說,我們先看下小程序的運行機(jī)制:

 

 

可以看出,小程序自定義組件是渲染與邏輯脫離,想在邏輯層拿到渲染的結(jié)果進(jìn)而進(jìn)行對比測試是很難辦到的。而且目前小程序的環(huán)境并不開放,想要完整構(gòu)造模擬出小程序的運行環(huán)境也不太科學(xué)。另外我們這邊只是需要對小程序的自定義組件做單元測試,對于小程序中很多非自定義組件相關(guān)的功能可以不考慮,而且在性能上也不那么苛求,所以一個思路是調(diào)整底層運行機(jī)制,將雙線程合并為一個線程,將 wxml、wxss 的解析器改成純 js 實現(xiàn)。

實現(xiàn)

只是有思路還不夠,在實現(xiàn)過程中還是有一些坎的。比如要如何比較好的模擬出小程序自定義組件的各種特性和功能呢?自己實現(xiàn)也不是不行,問題在于維護(hù)的成本,如果小程序自定義組件實現(xiàn)了一個功能,測試工具還得更新一下。另外如果在實現(xiàn)上略有差池的話,可能小程序端的一個小調(diào)整對于測試工具都可能是傷筋動骨式的改造。所以這里直接將小程序自定義組件的最核心模塊—— exparser 從基礎(chǔ)庫中抽離出來。

exparser 是自定義組件系統(tǒng)的內(nèi)核,是一個完整獨立的模塊,不依賴于基礎(chǔ)庫中其他模塊。它完全脫離于小程序的 api 和運行機(jī)制體系,所以無論是單線程還是雙線程機(jī)制都可以使用。exparser 提供的是自定義組件系統(tǒng)最底層的接口,測試工具將其進(jìn)行二次封裝成自定義組件測試環(huán)境。如果基礎(chǔ)庫有關(guān)于自定義組件的更新,如果是底層改造,則直接更新 exparser 模塊即可;如果只是外層改造,那基本上是暴露接口層面的調(diào)整,也不必作太多大范圍的調(diào)整。

PS:目前雖然 exparser 已經(jīng)發(fā)布到 npm,但是仍然只是混淆壓縮后到代碼,屬于半開源狀態(tài),不建議開發(fā)者直接使用。

使用

miniprogram-simulate 本是自定義組件腳手架 miniprogram-custom-component 中的一部分,現(xiàn)單獨抽離出來,方便開發(fā)者們作更多的使用選擇(腳手架中默認(rèn)使用 jest 來搭配使用,直接使用此工具集則可以搭配其他想要使用的測試框架,比如 mocha 等)。

下述只簡單介紹下用法,首先安裝此工具集:

npm install --save-dev miniprogram-simulate
復(fù)制代碼

然后此工具集必須搭配其他測試框架和 jsdom 來使用,比如 jest。因為 jest 內(nèi)置有 jsdom,所以也就不需要額外安裝 jsdom 了,以下面一個自定義組件作為例子:

<!-- 自定義組件:comp.wxml -->
<view class="index">{{prop}}</view>

/* 自定義組件:comp.wxss */
.index {
  color: green;
}

// 自定義組件 comp.js
Component({
  properties: {
    prop: {
      type: String,
      value: 'index.properties'
    },
  },
})

這是一個極其簡單的自定義組件,之后我們便可開始在 comp.test.js 里編寫測試用例。

起步

加載和渲染自定義組是最基礎(chǔ)的功能:

// 自定義組件 comp 的測試用例:comp.test.js
const path = require('path')
const simulate = require('miniprogram-simulate')

test('comp', () => {
  const id = simulate.load(path.join(__dirname, './comp')) // 此處必須傳入絕對路徑
  const comp = simulate.render(id) // 渲染成自定義組件樹實例

  const parent = document.createElement('parent-wrapper') // 創(chuàng)建父親節(jié)點
  comp.attach(parent) // attach 到父親節(jié)點上,此時會觸發(fā)自定義組件的 attached 鉤子

  expect(comp.querySelector('.index').dom.innerHTML).toBe('index.properties') // 測試渲染結(jié)果
  // 執(zhí)行其他的一些測試邏輯
  
  comp.detach() // 將組件從父親節(jié)點中移除,此時會觸發(fā)自定義組件的 detached 生命周期
})

獲取數(shù)據(jù)

可以獲取自定義組件的數(shù)據(jù):

test('comp', () => {
    // 前略

    // 判斷組件數(shù)據(jù)
    expect(comp.data).toEqual({
        a: 111,
    })
})

更新數(shù)據(jù)

可以更新自定義組件的數(shù)據(jù):

test('comp', () => {
    // 前略

    // 更新組件數(shù)據(jù)
    comp.setData({
        a: 123,
    })
})

獲取子組件

可以獲取自定義組件的子組件:

test('comp', () => {
    // 前略

    const childComp = comp.querySelector('#child-id')
    expect(childComp.dom.innerHTML).toBe('<div>child</div>')
})

觸發(fā)事件

可以模擬觸發(fā)自定義組件的事件:

test('comp', () => {
    // 前略

    comp.dispatchEvent('touchstart') // 觸發(fā)組件的 touchstart 事件
    childComp.dispatchEvent('tap') // 觸發(fā)子組件的 tap 事件
})

至此,應(yīng)該能大概了解到這個工具集的用途。這些只是簡單的使用介紹,本文只是個引子,更多詳細(xì)的用法請移步到 github 倉庫上查閱。

尾聲

要想判斷一個自定義組件的質(zhì)量如何,其中最簡單的方法就是看單元測試的表現(xiàn),想要別人使用你的自定義組件,質(zhì)量把關(guān)很重要,目前 miniprogram-simulate 已經(jīng)實現(xiàn)了最基本的功能,其他功能也在盡力施工中,有什么好的建議或者使用上遇到什么問題也可以提 issue。如果好評請 star 噢~


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://www.kknew.com.cn/wxmini/doc/course/25009.html 復(fù)制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服
易小優(yōu)
轉(zhuǎn)人工 ×