模拟数据
此 mock 插件是一个 alova 的请求适配器,与传统的 Proxy 形式不同,你可以很好地控制使用 mock 数据的使用范围,你可以控制全局范围、某一组接口范围,甚至是某一个接口的启用和禁用,这在我们实际的业务场景中是很有用的,每一次的迭代都会新增或修改一组接口,我们希望让之前的功能还是走已开发好的接口,而让新增或修改的接口走模拟数据,此时就可以将每个开发人员针对本次迭代涉及到的接口分为一组,并对它们进行开启或关闭。
特性
- 与 alova 无缝协作
- 模拟请求任意分组,可控制全局、组、以及单个模拟接口的启用和禁用
- 与 mockjs 配合使用
- 不污染生产环境
安装
- npm
- yarn
- pnpm
npm install alova @alova/mock --save
yarn add alova @alova/mock
pnpm install alova @alova/mock
以 下为使用流程。
使用
定义 mock 接口
使用defineMock定义一组 mock 接口,你可以在每一项模拟接口中直接指定返回响应数据,或指定为回调函数动态计算响应数据。
import { defineMock } from '@alova/mock';
export default defineMock(
{
// 捕获get请求
'/todo': [1, 2, 3, 4],
// rest风格请求
'/todo/{id}': ({ params }) => {
const id = params.id;
// ...
return {
title: '...',
time: '10:00'
};
},
// 捕获post请求
'[POST]/todo': ({ query, data }) => {
// ...
return { success: true };
},
// 返回更详细的信息
'[POST]/todo': ({ query, data }) => {
// ...
return {
status: 403,
statusText: 'unknown error',
responseHeaders: {
// ...
},
body: {
success: true
}
};
},
// 模拟网络错误
'[POST]/todo': ({ query, data }) => {
throw new Error('network error');
},
// key前面添加`-`,表示禁用此mock接口
'-[DELETE]/todo/{id}': ({ params }) => {
// ...
return { success: true };
}
},
true
); // 第二个参数表示是否启用本组mock接口,默认为true,可以指定为false关闭
创建模拟请求适配器
在调用createAlova时创建一个模拟请求适配器,并将 mock 接口传入即可完成。
import adapterFetch from 'alova/fetch';
import { createAlovaMockAdapter } from '@alova/mock';
import mockGroup1 from './mockGroup1';
const mockAdapter = createAlovaMockAdapter([mockGroup1, /** ... */], {
// 全局控制是否启用mock接口,默认为true
enable: true,
// 非模拟请求适配器,用于未匹配mock接口时发送请求
httpAdapter: adapterFetch(),
// mock接口响应延迟,单位毫秒
delay: 1000,
// 是否打印mock接口请求信息
mockRequestLogger: true,
// 模拟接口回调,data为返回的模拟数据,你可以用它构造任何你想要的对象返回给alova
// 以下为默认的回调函数,它适用于使用 `alova/fetch` 请求适配器
// 如果你使用的是其他请求适配器,在模拟接口回调中请自定义返回适合适配器的数据结构
onMockResponse: data => new Response(JSON.stringify(data))
});
export const alovaInst = createAlova({
baseURL: 'http://xxx',
// 使用mock请求适配器,如果需要切换适配器,请看下面的实践建议
requestAdapter: mockAdapter,
statesHook: /** ... */
});
路径匹配模式
版本要求
1.5.0+
默认情况下,在defineMock中定义的路径是一个 url 的完整 pathname,看以下代码片段。
const alovaInst = createAlova({
baseURL: 'https://api.alovajs.org'
// ...
});
alovaInst.Get('/user?id=1').send();