ivormock--一个去中心化的mock工具

497 阅读3分钟

为什么需要一个新的工具?

现有的大部分mock工具,都是“中心化”的。所谓的“中心化”,即为了解决团队协作问题,需要将mock服务器部署在一台中央服务器上。这样,团队创建的mock接口集中到一处,才可以在团队之间共享。典型如大搜车的easy-mock.

这种方式带来的问题是:

  1. 无法通过本地编辑器编辑。需要通过一个线上的编辑器,来创建API,编辑接口响应内容。
  2. 版本控制需要付出额外的成本。
  3. 线上的内容可能被随时编辑改变,导致开发过程中出现冲突等。
  4. 额外的资源:至少需要准备一台服务器。

这就是为什么我创建了ivormock

ivormock的解决思路

开发过程中,在IDE中创建mock API是一个很自然的想法。“为什么我要切换到一个浏览器里去创建API?这给我带来了额外的负担”,这是我在日常开发中经常会有的想法。

跟随着项目代码一起编辑mock API,可以使用项目的git来进行版本控制,可以轻松地追踪mock API修改的过程,可以方便地与团队进行共享;当我想要修改接口响应时,直接在IDE中编辑即可,不会影响团队内其他人的使用;同时,这样也不会部署在额外的服务器上--跟随着开发服务器一起启动即可。这样不是很方便吗?

ivormock便是基于这样的想法实现。这赋予了ivormock优秀的特性:

  1. 去中心化,不再需要中央服务器
  2. “零成本”的版本控制
  3. 修改可经过review,不会影响其他开发者协作开发
  4. 轻量级

在此基础之上,ivormock还支持:

  1. 从文件生成路由
  2. 根据需要切换API响应,不再需要频繁的注释代码来获得不同的响应
  3. 监听mock文件修改,自动重新注册路由,不需要重启服务器
  4. 支持多项目同时协作
  5. 提供webpack/vite插件,易于与现有工作流集成

如何使用

ivormock 提供了命令行工具,webpack/vite插件,可通过命令行和插件的方式来使用。后面还计划提供UI界面来维护ivormock项目。

安装

可选择全局安装或者在项目中安装。

# 安装ivormock
npm install -g ivormock

# 安装webpack插件
npm install webpack-plugin-ivormock

# 安装vite插件
npm install vite-plugin-ivormock

API

可通过ivormock -h查看ivormock的API。

$ ivormock -h

Usage: ivormock [options] [command]

Options:
  -V, --version   output the version number
  -h, --help      display help for command

Commands:
  create <name>   创建项目
  delete <name>   删除项目
  config <name>   修改项目配置
  list            获取所有项目列表
  start <name>    启动项目
  stop <name>     停止项目
  restart <name>  重启项目
  doc <cmd>       ivormock文档相关管理,TBD
  help [command]  display help for command

可以看到,ivormock主要是对项目的管理,包括项目的增删改查和启动、停止。

创建mock API

ivormock里,文件即路由。文件名会被注册成路由,文件内容会作为mock API的响应。

文件名

文件名由方法名路由组成,以__分割;路由中的/替换为_。文件名规则示例如下:

get__api_v1_users.js         // GET /api/v1/users
api_v1_users.js              // GET /api/v1/users, 不写方法,默认为get
post__api_v1_user.js         // POST /api/v1/user
post__api_v1_user_[id].js    // POST /api/v1/user/:id

文件内容

文件内容作为mock API响应。支持三种使用方式,示例如下:

直接返回响应

// post__api_v1_user_[id].js

module.exports = function() {
    return {
        foo: "sth",
        boo: "sth",
        // anything
    }
}

返回失败的响应,自定义http code

// post__api_v1_user_[id].js

module.exports = function() {
    return {
        $$status: 400,
        $$body: {
            foo: "sth",
            boo: "sth",
            // anything
        }
    }
}

切换响应内容

// post__api_v1_user_[id].js

module.exports = function() {
    return {
        $$type: "SWITCH",     // tell ivormock to switch response on demand
        $$active: 1,          // specify current active response index
        $$options: [          // all possible responses
            {
                $$status: 200,
                $$body: {
                    message: "this is a success response"
                }
            },
            {
                $$status: 500,
                $$body: {
                    message: "this is a failed response"
                }
            }
        ]
    }
}

获取请求参数

ivormock使用koa2开发,koa context会作为参数传递给mock函数。可通过context获取请求参数。

module.exports = function(ctx) {
    // get params in body
    const body = ctx.request.body;
    if (!body.name) {
        return {
            $$status: 400,
            $$body: {
                message: "name is needed!"
            }
        }
    }
    return {
        $$status: 204
    }
}

与构建工具集成

ivormock提供webpack/vite插件,以方便开发者与现有工作流集成。

webpack集成

const IvormockWebpackPlugin = require("webpack-plugin-ivormock");

const isDev = process.env.NODE_ENV === "development";

module.exports = {
    // ... 
    plugins: [
        //...
        // Only used in development envorioment
        isDev && new IvormockWebpackPlugin({
            mockPath: "mock",   // mock file path, relative to project root
            port: 3456,          // ivormock server port
            prefix: "/mock"     // request with "/mock" prefix will pass to ivormock 
        })
    ]
}

vite集成

const ivormock = require("vite-plugin-ivormock");

export default {
    // ... 
    plugins: [
        //...
        ivormock({
            mockPath: "mock",   // mock file path, relative to project root
            port: 3456          // ivormock server port
        })
    ]
}

源码

源码地址github.com/Hquestion/i…, 仓库正在全力完善中,欢迎提PR / Issue。