MorJS Mock 如何編寫 Adapter

2024-01-16 15:08 更新

adapters 中配置的 adapter,會(huì)在 mock 初始化階段中自動(dòng)依次 import,new 對應(yīng)的實(shí)例對象并執(zhí)行 run 方法,adapterrun 需要返回一個(gè)結(jié)果用于優(yōu)先替代后續(xù)的 mock 結(jié)果,若不返回或返回 undefined 則繼續(xù)執(zhí)行后續(xù)的 mock 流程,所以一個(gè)基本的 adapter 的結(jié)構(gòu)如下:

export default class XXXAdapter {
  private options: Record<string, any>

  constructor(options) {
    this.options = options
  }

  public run(runOptions: IRunOptions) {
    // 執(zhí)行相關(guān)邏輯 獲取最終結(jié)果 result
    return result || undefined
  }
}

runOptions 參數(shù)?

在 mock 初始化對應(yīng)的實(shí)例對象后,自動(dòng)調(diào)用的 run 方法會(huì)傳一些固定的參數(shù)提供給開發(fā)者使用,runOptions 目前包含四個(gè)屬性:

  • apiName: 調(diào)用的 JSAPI 名稱,如 getSystemInfo request 等,開發(fā)者可以根據(jù)該屬性選擇介入哪些 JSAPI 的 mock 流程;
  • apiArguments: 調(diào)用的 API 的傳參,例如調(diào)用 request 時(shí)的入?yún)?,可根?jù)參數(shù)不同執(zhí)行不會(huì)邏輯流程或返回不同結(jié)果;
  • originalGlobal: 小程序原生全局對象 如支付寶的 my(微信的 wx),該原生方法不會(huì)走 mock 流程避免 mock 嵌套死循環(huán);
  • mockContext: webpack require 的 mock 目錄結(jié)構(gòu),詳情可參考 webpack - Dependency Management
export default class XXXAdapter {
  private options: Record<string, any>

  constructor(options) {
    this.options = options
  }

  public run(runOptions: IRunOptions) {
    const { apiName, apiArguments, originalGlobal, mockContext } = runOptions
    // 執(zhí)行相關(guān)邏輯 獲取最終結(jié)果 result
    return result || undefined
  }
}

adapter 傳參?

在如何使用 adapter 的時(shí)候說過,每個(gè) adapter 支持 string 類型和 array 兩種類型,想要給 adapter 傳參必須使用 array 類型,第二個(gè)參數(shù)為傳給 adapter 的參數(shù),傳入的參數(shù)可以在 constructoroptions 中獲取

// mor.config.ts
export default defineConfig([
  {
    name: 'ali',
    target: 'alipay',
    ...,
    mock: {
      ...,
      adapters: [
        [
          // 參數(shù)①: 本地 adapter 或 npm 包名
          'your_adapter_name',
          // 參數(shù)②: 提供 adapter 的參數(shù)
          {
            type: 'your_parameter_type',
            api: 'your_parameter_api'
          }
        ],
      ],
    }
  },
])
// your_adapter_name/index.ts
export default class MtopAdapter {
  private options: Record<string, any>

  constructor(options) {
    this.options = options
  }

  public run(runOptions: IRunOptions) {
    const { apiName, apiArguments, mockContext, originalGlobal } = runOptions
    const {
      type, // your_parameter_type
      api // your_parameter_api
    } = this.options || {}
    // 執(zhí)行相關(guān)邏輯 獲取最終結(jié)果 result
    return result
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號