MorJS Mock 如何编写 Adapter
在 adapters 中配置的 adapter,会在 mock 初始化阶段中自动依次 import,new 对应的实例对象并执行 run 方法,adapter 的 run 需要返回一个结果用于优先替代后续的 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 名称,如getSystemInforequest等,开发者可以根据该属性选择介入哪些 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 的参数,传入的参数可以在 constructor 的 options 中获取
// 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
}
}