MorJS Mock 如何编写 Adapter

2024-01-16 15:08 更新

adapters 中配置的 adapter,会在 mock 初始化阶段中自动依次 importnew 对应的实例对象并执行 run 方法,adapterrun 需要返回一个结果用于优先替代后续的 mock 结果,若不返回或返回 undefined 则继续执行后续的 mock 流程,所以一个基本的 adapter 的结构如下:

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

  constructor(options) {
    this.options = options
  }

  public run(runOptions: IRunOptions) {
    // 执行相关逻辑 获取最终结果 result
    return result || undefined
  }
}

runOptions 参数

在 mock 初始化对应的实例对象后,自动调用的 run 方法会传一些固定的参数提供给开发者使用,runOptions 目前包含四个属性:

  • apiName: 调用的 JSAPI 名称,如 getSystemInfo request 等,开发者可以根据该属性选择介入哪些 JSAPI 的 mock 流程;
  • apiArguments: 调用的 API 的传参,例如调用 request 时的入参,可根据参数不同执行不会逻辑流程或返回不同结果;
  • originalGlobal: 小程序原生全局对象 如支付宝的 my(微信的 wx),该原生方法不会走 mock 流程避免 mock 嵌套死循环;
  • mockContext: webpack require 的 mock 目录结构,详情可参考 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
    // 执行相关逻辑 获取最终结果 result
    return result || undefined
  }
}

adapter 传参

在如何使用 adapter 的时候说过,每个 adapter 支持 string 类型和 array 两种类型,想要给 adapter 传参必须使用 array 类型,第二个参数为传给 adapter 的参数,传入的参数可以在 constructoroptions 中获取

// mor.config.ts
export default defineConfig([
  {
    name: 'ali',
    target: 'alipay',
    ...,
    mock: {
      ...,
      adapters: [
        [
          // 参数①: 本地 adapter 或 npm 包名
          'your_adapter_name',
          // 参数②: 提供 adapter 的参数
          {
            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 || {}
    // 执行相关逻辑 获取最终结果 result
    return result
  }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号