MorJS Mock 如何編寫 Adapter

2024-01-16 15:08 更新

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

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

  constructor(options) {
    this.options = options
  }

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

runOptions 參數(shù)?

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

  • apiName: 調(diào)用的 JSAPI 名稱,如 getSystemInfo request 等,開發(fā)者可以根據(jù)該屬性選擇介入哪些 JSAPI 的 mock 流程;
  • apiArguments: 調(diào)用的 API 的傳參,例如調(diào)用 request 時的入?yún)?,可根?jù)參數(shù)不同執(zhí)行不會邏輯流程或返回不同結(jié)果;
  • originalGlobal: 小程序原生全局對象 如支付寶的 my(微信的 wx),該原生方法不會走 mock 流程避免 mock 嵌套死循環(huán);
  • mockContext: webpack require 的 mock 目錄結(jié)構,詳情可參考 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í)行相關邏輯 獲取最終結(jié)果 result
    return result || undefined
  }
}

adapter 傳參?

在如何使用 adapter 的時候說過,每個 adapter 支持 string 類型和 array 兩種類型,想要給 adapter 傳參必須使用 array 類型,第二個參數(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í)行相關邏輯 獲取最終結(jié)果 result
    return result
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號