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 名称,如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 的参数,传入的参数可以在 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
}
}