web开发 之 mock方案研究

本文联合作者: 诺之林 / 小怪兽 / 代码猴

目录

json-server

basic

  • GET
curl -X GET http://localhost:3000/todos

curl -X GET http://localhost:3000/todos/1
  • POST
curl -X POST -H "Content-type: application/json" -d '{"todo":"Post ToDo"}' http://localhost:3000/todos
  • PATCH
curl -X PATCH -H "Content-type: application/json" -d '{"todo":"Patch ToDo"}' http://localhost:3000/todos/1
  • DELETE
curl -X DELETE http://localhost:3000/todos/5

config

  • json-server.json
{
    "port": 3001,
    "routes": "routes.json"
}
  • routes.json
{
    "/api/*": "/$1",
    "/items\\?id=:id": "/todos/:id"
}

advanced

  • Filter
curl -X GET http://localhost:3000/posts?title=post-title-1
  • Paginate
curl -X GET http://localhost:3000/posts?_page=2
  • Sort
curl -X GET http://localhost:3000/posts?_sort=title&_order=desc
  • Slice
curl -X GET http://localhost:3000/posts?_start=2&_end=5

faker

curl -X GET http://localhost:3000/employees

小结

  • 简单

  • 快速

  • RESTful

Easy Mock

Example

  • GET
curl -X GET http://www.easy-mock.com/mock/59db1b2647bc3811aa7c4225/example/machines

curl -X GET http://www.easy-mock.com/mock/59db1b2647bc3811aa7c4225/example/machines?machine_state=on
  • POST
curl -X POST -H "Content-type: application/json" -d '{"machine_name":"挖掘机A01"}' http://www.easy-mock.com/mock/59db1b2647bc3811aa7c4225/example/machines
  • PATCH
curl -X PATCH -H "Content-type: application/json" -d '{"machine_name":"挖掘机Z01"}' http://www.easy-mock.com/mock/59db1b2647bc3811aa7c4225/example/machines/999
  • DELETE
curl -X DELETE http://www.easy-mock.com/mock/59db1b2647bc3811aa7c4225/example/machines/999

Mock.js

{
  "code": 0,
  "result": {
    'data|1-10': [{
      'id|+1': 100,
      machine_name: '@ctitle(3, 20)',
      captain_name: '机长@cname(2, 3)',
      assets_code: 'AC@integer(10000000, 99999999)',
      image_cover_url: '@image("200x200", "#00405d", "#FFF", "测试图片")',
      'is_online|1-2': true,
      source: '@pick(["bought", "rented", "unknown"])',
      machine_state: function({
        _req,
        Mock
      }) {
        if (_req.query.machine_state === 'on') {
          return 'on'
        } else if (_req.query.machine_state === 'off') {
          return 'off'
        } else {
          return Mock.mock('@pick(["on", "off"])')
        }
      },
      height: '@float(1, 100, 1, 2)',
    }],
    total_count: '@integer(1, 10)',
  }
}

小结

  • 在线服务

  • 可视化

  • 快速

dva

basic

  • .roadhogrc.mock.js
const mock = {};
require('fs').readdirSync(require('path').join(__dirname + '/src/mock')).forEach(function (file) {
  Object.assign(mock, require('./src/mock/' + file));
})
module.exports = mock;
  • ./src/mock/machine.js
const Mock = require('mockjs');

const database = Mock.mock({
  'data|20': [
    {
      'id|+1': 100,
      machine_name: '@CTITLE(3, 20)',
    },
  ],
}).data;

module.exports = {
  ['GET /machines'](req, res) {
    const pageSize = 10;
    const page = 1;

    res.status(200).json({
      data: database.slice((page - 1) * pageSize, page * pageSize),
      total: database.length,
    });
  },
}

advanced

  • .roadhogrc.mock.js
import Mock from 'mockjs';
import mockTemplate from './src/mock';

const mockApi = {};

mockTemplate.forEach((routerObject) => {
    if (routerObject.isMock === true) {
        mockApi[routerObject.method + ' /mock' + routerObject.router] = (req, res) => {
            res.end(JSON.stringify(
                Mock.mock({
                    "XCmdrCode": 0,
                    'XCmdrResult': routerObject.data,
                })
            ));
        };
    }
});

export default mockApi;
  • .roadhogrc.js
proxy: {
    "!/mock/**": {
        target: {
            host: "sa.zhgcloud.com",
            protocol: "https:",
            port: 443
        },
        ignorePath: false,
        changeOrigin: true,
        secure: false,
        bypass: function (req, res, proxyOptions) {
            if (req.path.indexOf('/mock') !== 0 && req.headers['x-cmd-request'] === undefined && req.headers['x-requested-with'] === undefined) {
                return './public/index.html';
            }
        },
    }
}
  • ./src/mock/index.js
export default [
    {
        method: 'GET',
        router: '/machines/:id',
        data: {
            'data_list|0-10': [{
                'id|+1': 1,
                machine_name: 'mock GET @CTITLE(2,20)',
            }],
        },
        isMock: true,
    }, 
];
  • ./src/utils/request.js
import fetch from 'dva/fetch';
import pathToRegexp from 'path-to-regexp';
import mockTemplate from '../mock';
import request from '../utils/request';

function isMock(method, url) {
    let hasMock = false;
    mockTemplate.forEach((routerObject) => {
        if (routerObject.isMock === true && method === routerObject.method && pathToRegexp(routerObject.router).exec(url.split('?')[0]) !== null) {
            hasMock = true;
        }
    });
    return hasMock;
}

const apiFetch = (url, options) => {
    const method = options.method !== undefined ? options.method.toUpperCase() : 'GET';

    if (isMock(method, url)) {
        return fetch(`/mock${url}`, options);
    } 
    
    return fetch(url, options);
};

小结

  • 非侵入式

  • 部分mock

  • 数据格式校验

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,819评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,374评论 4 61
  • 近日林丹令人震惊的爆出背妻偷食事件,引起不少热议,大家众说纷纭,各执其词,实在是够热闹了。看了几天,本不愿置评,但...
    西风瘦马欧阳阅读 1,679评论 1 2
  • 导 语 肖莉莉是别人介绍过来的美女,据说:这个女的已经失恋三个月,也是时候找个男朋友了。而刚好,我也空窗期了很久。...
    飘雨桐V阅读 3,003评论 0 0
  • 喜阅哲妈阅读 2,241评论 0 0

友情链接更多精彩内容