Skip to content

数据模拟

Fangshi He edited this page Jul 25, 2016 · 2 revisions

数据模拟

为了让 node-ral 与后端服务开发联调更加顺畅,node-ral 提供了一套 mock 机制用来实现假数据的模拟。

每一个在 conf 文件中定义的服务均可以拥有一个自己独立的 mock 描述用来实现独立的假数据模拟。

示例

举例来说,当我们的服务设计依赖两个服务A与B时,如果A和B服务仅仅完成了接口定义而尚未完成开发,那么我们无需在业务的action层或者model层进行数据模拟的硬编码,而是直接使用 node-ral 声明服务的 mock 逻辑。这样的好处在于在后端A与B两个服务完成开发后,只需要关闭 mock 开关就可以快速的与后端联调,而且即使A,B服务使用存在耦合,也可以独立的开关指定的 mock 进行调试,如仅 mock 服务A,对 B 服务采用实际调用的方式进行。

// RAL服务的配置,配置文件中有2个独立的服务A与B,文件需放置在 ral 配置的 confPath 下
module.exports = {
  A: {
    protocol: 'http',
    unpack: 'json',
    pack: 'querystring',
    method: 'GET',
    balance: 'roundrobin',
    timeout: 1000,
    retry: 0,
    encoding: 'utf-8',
    path: '/',
    server: [{
      host: '127.0.0.1',
      port: 8080
    }]
  },
  B: {
    protocol: 'http',
    unpack: 'json',
    pack: 'form',
    method: 'POST',
    balance: 'roundrobin',
    timeout: 1000,
    retry: 0,
    encoding: 'utf-8',
    path: '/',
    server: [{
      host: '127.0.0.1',
      port: 2345
    }]
  },
}
// RAL服务的Mock配置,文件需放置在 ral 配置的 mockPath 下
module.exports = {
  A: {
    mock: function (options) {
      return {
        errno: 0,
        msg: '',
        data: {
          time: new Date()
        }
      }
    }
  },
  B: {
    mock: function (options) {
      switch (options.path) {
      case '/a':
        return {
          errno: 0,
          msg: '',
          data: {
            path: '/a'
          }
        };
      case '/b':
        return {
          errno: 0,
          msg: '',
          data: {
            path: '/b'
          }
        };
        break;
      default:
        return {
          errno: 100010,
          msg: 'invalid path'
        }
      }
    }
  }
}

配置完成之后,配置环境变量 RAL_MOCK=true 即可开启全局的服务 mock,此时使用 RAL 访问 A,B服务均会进入 mock 目录下的处理逻辑中。

更多参数

除了 mock 参数用于实现 mock 逻辑外,还有一些辅助参数用于模拟更灵活的后端服务表现

/**
 * mock格式
 * {
 *     minRespTime: 100,                // respTimeMethod 为 random 时最快响应时间
 *     maxRespTime: 300,                // respTimeMethod 为 random 时最慢响应时间
 *     respTime: 200,                   // respTimeMethod 为 fixed 时的响应时间,默认为0
 *     respTimeMethod: 'random|fixed',  // 设置响应时间的类型,默认为 fixed
 *     fatalRate: 0.5,                  // 请求失败率,默认为0
 *     fatalMessage: 'mock fatal hit'   // 请求失败时,返回的 Error 信息
 *     mock: function (options) {}
 * }
 */

MOCK开关

node-ral 支持多种手段对 mock 配置进行开关,默认情况下 node-ral 不会加载任何 mock 配置,而以下环境变量可开启所有服务的 mock 配置。

export RAL_MOCK=true

如果仅需要 A 服务开启 mock,则可以使用 RAL_MOCK 指定需要 mock 的服务

export RAL_MOCK=A

如果需要同时开启A,B两个服务,还可以用逗号分割开来

export RAL_MOCK=A,B

如果不希望使用环境变量,也可以通过 node-ral 的 conf 配置显示开启启用 mock

module.exports = {
  A: {
    protocol: 'http',
    unpack: 'json',
    pack: 'querystring',
    method: 'GET',
    balance: 'roundrobin',
    timeout: 1000,
    retry: 0,
    encoding: 'utf-8',
    path: '/',
    enableMock: true, // 使用mock
    server: [{
      host: '127.0.0.1',
      port: 8080
    }]
  }
}