-
Notifications
You must be signed in to change notification settings - Fork 36
数据模拟
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) {}
* }
*/
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
}]
}
}