默认/mock
文件夹下所有文件为 mock 文件。
比如:
.
├── mock
├── custom-data // 自定义mock数据文件夹
| └── index.ts // 自定义mock数据入口文件
| └── template-data.ts // 模版数据例子
├── schema-api // schema接口定义文件夹(genTsDir没配置,默认生成在mock下)
| ├── interface-api.ts // 生成最终的http 接口api数据类型入出参定义
| ├── request.ts // requestFilePath没设置时,生成默认axios请求库文件
| ├── request-api.ts // 请求接口文件
| ├── schema.ts // ts类型文件生成json schema文件
| └── ts-schema.ts // openapi 生成ts类型文件
├── interface-mock-data.ts // 生成最终的http mock 默认数据
└── mock-data.ts // 生成mock数据文件
-
注意:生成的mock数据,使用需要忽略custom-data,schema-api文件夹,不需要走 mock 的文件。
- @liangskyli/mock 已经默认忽略了,不需要额外配置。
exclude: [ 'mock/custom-data/**', 'mock/schema-api/**', ],
-
mock 数据修改,例如:在上图结构中 只能在custom-data目录下,进行自定义数据修改。
- custom-data/index.ts
// 自定义mock数据入口,文件不可删除。 import type { ICustomsData } from '@liangskyli/http-mock-gen'; import { TemplateData } from './template-data'; const CustomData: ICustomsData = { // 自定义mock数据示例 // TemplateData 对应接口数据 ...TemplateData, }; export default CustomData;
- custom-data/template-data.ts
import type { ICustomDataMethods, ICustomsData, PartialAll, Request, } from '@liangskyli/http-mock-gen'; import type { IApi } from '../schema-api/interface-api'; export const TemplateData: ICustomsData<{ '/root/getQueryParam-v3/{id}': ICustomDataMethods< PartialAll<IApi['/root/getQueryParam-v3/{id}']['get']['Response']>, 'get' >; }> = { '/root/getQueryParam-v3/{id}': { get: { /** mock 响应数据(函数调用,支持动态生成数据) */ response: { code: 0, data: { a33: 'a33' }, msg: 'msg' }, /** mock 多场景响应数据 */ sceneData: [ { // eslint-disable-next-line requestCase: (request: Request) => { // request 为http传入参数,可以根据不同参数配置不同场景数据 // mock 场景数据判断,返回true时使用该场景,匹配成功后,跳出匹配 return false; }, response: { code: 0, data: { a33: 'a33' }, msg: 'msg' }, }, ], }, }, };
-
ICustomData 数据结构,里面可以按格式要求,配置响应数据,及多场景相关数据。
- 注意:ICustomData 里的 key值(例:路径/v1/building/get-list)不包含mockPathPrefix的配置值,请保持和openapi文件里paths路径一致。
-
自定义mock数据(含多场景响应数据)支持按需配置,未配置使用默认值。
- 智能合并mock数据例子如下
// 默认数据 const defaultData = { retCode: 0, data: { blockList: [{ isBindErp: false, buildingName: 'buildingName' }], isFuLi: false }, retMsg: 'retMsg', }; //自定义数据response里可以这样 const response = { data: { blockList: [ { buildingName: 'buildingName11' }, { isBindErp: true, }, ], }, }; //自定义数据和默认数据合并后,会生成下面mock数据 const result = { retCode: 0, data: { blockList: [ { isBindErp: false, buildingName: 'buildingName11' }, { isBindErp: true, buildingName: 'buildingName', }, ], isFuLi: false, }, retMsg: 'retMsg', };
-
sceneData 命中优先级 > 非命中优先级
-
相关类型定义说明
import type { IOpenapiMethod } from '@liangskyli/openapi-gen-ts';
import type { Request } from 'express';
interface IResponseData<T = any> {
/** mock 响应数据(函数调用,支持动态生成数据) */
response: T | (() => T);
}
export interface ISceneDataItem<T> extends IResponseData<T> {
/** mock 场景数据判断,返回true时使用该场景,匹配成功后,跳出匹配 */
requestCase: (request: Request) => boolean;
}
export type ICustomDataValue<T> = IResponseData<T> & {
/** mock 多场景响应数据 */
sceneData?: ISceneDataItem<T>[];
};
export type ICustomDataMethods<
T = any,
M extends IOpenapiMethod = any,
> = Partial<Record<M, ICustomDataValue<T>>>;
export type ICustomData<
T = any,
K extends keyof any = string,
M extends IOpenapiMethod = any,
> = Record<
/** http 接口路径 */
K,
ICustomDataMethods<T, M> | undefined
>;
export type ICustomsData<
T extends Record<
/** http 接口路径 */
string,
ICustomDataMethods
> = Record<
/** http 接口路径 */
string,
ICustomDataMethods
>,
> = T;
better-mock 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。
比如:
- custom-data/template-data.ts
import type {
ICustomDataMethods,
ICustomsData,
PartialAll,
Request,
} from '@liangskyli/http-mock-gen';
import type { IApi } from '../schema-api/interface-api';
import mockjs from 'better-mock';
export const TemplateData: ICustomsData<{
'/root/getQueryParam-v3/{id}': ICustomDataMethods<
PartialAll<IApi['/root/getQueryParam-v3/{id}']['get']['Response']>,
'get'
>;
}> = {
'/root/getQueryParam-v3/{id}': {
get: {
/** mock 响应数据(函数调用,支持动态生成数据) */
response: { code: 0, data: { a33: mockjs.Random.string(3) }, msg: 'msg' },
/** mock 多场景响应数据 */
sceneData: [
{
// eslint-disable-next-line
requestCase: (request: Request) => {
// request 为http传入参数,可以根据不同参数配置不同场景数据
// mock 场景数据判断,返回true时使用该场景,匹配成功后,跳出匹配
return false;
},
response: { code: 0, data: { a33: 'a33' }, msg: 'msg' },
},
],
},
},
};