背景
存在问题
?开发联调周期长,自测难以充分; ?测试/视觉回归成本高; ?线上样式问题定位还原周期长;
需求分析
mock方式应该在本地pc端调试和真机调试都能够方便使用;
不同状态的切换交互应该带有业务语义,能够方便开发和测试快速找到想要的订单状态,而不只是简单的修改接口的某个字段值;
4.mock数据精简mock的方式本身应该和业务代码尽量解耦,即不会将mock的逻辑引入线上环境;
订单页面状态虽多,但是接口往往统一,接口字段,对mock数据的维护不应该每一种状态都是单独一份mock数据而是应该在一份主的mock数据上针对产生变化的字段进行单独mock;
技术方案
方案总揽
胶水层实现
{
"plugins": [
[
"build-plugin-rax-app",
{
"targets": [
"web"
],
"type": "mpa"
}
],
"@ali/build-plugin-rax-mock",
"./selfBuild"
]
}
if (api.context.command === 'build') return;
api.onGetWebpackConfig('web', (config) => {
config.entryPoints.values().forEach(entry => {
const entrys = entry.values();
const entryName = entrys[1];
// 只对订单页面注入
if (!/pages\/Order\/index$/.test(entryName)) {
return;
}
const prefixLoader = __filename;
const debugOrderPath = path.resolve(__dirname, 'src/components/DebugOrder');
const newOrderPage = `${prefixLoader}?debugOrderPath=${debugOrderPath}!${entryName}`;
entry.clear();
// 视图层组件
entry.add(entrys[0]);
entry.add(newOrderPage);
});
});
}
mock层实现
{
"api": "mtop.a.order.info",
"data": {
"status": 0,
"orderStatus": 1001,
...
"trade": {
"actions": [],
....
"amount": "2189.00",
"attributes": {
"consis": "10",
...
"ultronPP": "a_3_0@c",
}
}
},
"ret": [
"SUCCESS::调用成功"
],
"v": "1.0"
}
lib = window.lib;
// 拦截Mtop对象的request方法挂载
const getMtop = (originValue) =>
new Proxy(originValue, {
set(target, p, v, r) {
if (p === 'request'
|| p === 'H5Request') {
Reflect.set(target, p, getRequest(v), r);
} else {
Reflect.set(target, p, v, r);
}
return true;
}
});
// 拦截window.lib对象挂载mtop
if (!lib) {
lib = new Proxy({}, {
set(target, p, v, r) {
if (p.toLowerCase() === 'mtop') {
Reflect.set(target, p, v,r);
} else {
Reflect.set(target, p, v, r);
}
return true;
}
});
} else if (!lib.mtop) {
lib.mtop = getMtop({});
} else {
lib.mtop.request = getRequest(lib.mtop.request);
lib.mtop.H5Request = getRequest(lib.mtop.H5Request);
}
// 根据运行环境选择加载对应的request请求
function getRequest(originRequest) {
return async function () {
if (getMockSwitch()) {
//
}
return originRequest();
}
}
当本地页面发起 mtop 请求,如:mtop.com.test.one;
请求被注入的插件代码 hold 住,当判断是在本地开发环境或者链接带上mock query时, 用本地的mtopRquest替换,请求以 http://127.0.0.1/_mtop_mock_/com.test.one 格式重新发起请求;
请求打到本地 webpack-dev-server 上,server 再去本地 mock 目录上找 com.test.one.js4.如果找到就执行 com.test.one.js 文件,将执行结果返回5.如果未找到,则走原有的 mtop 请求;
视图层实现
// 状态数据结构
export interface ClassifyDataItem {
[key: string]: any;
/**
* 节点名称
*/
nodeName: string;
/**
* 节点枚举值
*/
node?: StatusEnum;
/**
* 对应的协议主状态
*/
status?: string;
/**
* 对应的协议副状态
*/
subStatus?: string;
childNode?: ClassifyDataItem[];
}
// 真实的状态数据枚举
export const classifyData: ClassifyDataItem[] = [
{
nodeName: '已下单,等待顺丰上门取件',
status: '1',
subStatus: '10',
node: StatusEnum.BUYER_CREATE,
childNode: [
...classifyData
]
}
...
];
本文暂时没有评论,来添加一个吧(●'◡'●)