测试工具Preset说明
# Preset
preset有`name`和`content`两个属性,`content`包含了主要的逻辑,`name`仅作为标识。
# `content`
content中写js的函数体,执行preset的时候会将该函数返回的值作为message通过websocket发送到服务器。
该函数当前提供参数同时会放到ctx变量中,提供参数如下:
**变量**
- **md5** - md5函数库,参考[md5 npm](https://www.npmjs.com/package/md5)
- **user** - 当前用户信息
- **room** - 当前房间信息
- **messages** - 当前房间的ws消息数组
- **preset** - 当前的preset对象
- **token** - 当前用户的登录token
- **env** - 将之前收到的message parse成object 通过`Object.assign(env, ...)`缓存起来的变量,同时可以调用`setEnv`进行修改, .e.g:例如收到两条roomMsg, msgBody会保存最新的一条的msgBody
- **this** - 该页面组件的vm实例
**方法**
- **request**: 封装了axios,会自动插入当前用户的token到`headers.authorization`,会自动对参数执行`qs.stringify`
- `request(url: String, data: Object):Promise`
- **sendAndReceive**: 通过发送数据包的方式来获得数据
- `sendAndReceive(options: Object):Promise`
- `@params {string} options.cmd`
- `@params {object} options.data` - ws包的参数
- `@params {string} options.receiveCmd` - 接收数据的cmd,默认是填入的cmd
- `@params {number} options.timeout` - 超时时间,默认2000(ms)
- `@return Promise` - 返回Promise,返回内容是第一个cmd为`receiveCmd`的ws数据包
- **getRoomInfo**:
- 封装了`sendAndReceive`方法,发送`{cmd: 'roomInfo'}`,然后获得第一个返回的cmd为`roomInfo`的ws的数据包
- `getRoomInfo():Promise`
- `@return Promise`
- **select**: 让用户选择提供的多个选项中的一个
- `select(options):Promsie`
- `@params {array} options.datas` - 多个选项,任意内容
- `@params {object} options.props` - 指定选项中用于展示图片的字段和展示文字描述的字段,默认均为空,表示使用对象本身
- `@params {string} options.props.name` - 展示文字描述的字段名
- `@params {string} options.props.image` - 展示图片的字段名
- `@params {string | number} options.width` - dialog的宽度
- **setEnv**: 缓存临时的环境变量,在不同的preset之间可以通用,实际上执行了`Object.assign(this.env, arguments[0])`
- `setEnv(env):void`
# 下面是送礼物给房主的preset的例子,这个例子只测试了前端,真正发送礼物的接口并没有调用
- ctx.request 发送ajax请求获得所有礼物配置
- 对礼物配置预处理后通过 ctx.select获得用户选择的礼物类型
- 然后通过ctx.getRoomInfo 获得房主的信息
- 最后发送礼物信息
```javascript
return ctx.request('/api/giftConfigs').then(res=>res.data.list).then(gifts=>{
let datas = gifts.map(g=>{g.img = 'https://shengjian-1258861966.image.myqcloud.com/gift/' + g.img;return g})
return ctx.select({
datas,
props: {
name: 'name',
image: 'img'
}
}).then(item=>{
let gift = item.option
return ctx.getRoomInfo().then(info=>{
return {
"msgBody": {
"tip": "",
"giftInfo": {
"receiver": info.seats.master.user.nickname,
"receiverId": info.seats.master.user._id,
...gift
},
"messageId": Date.now() + '',
"msgTime": Date.now(),
"userInfo": ctx.user,
"messageType": 2,
"isPrivate": false
},
"roomid": ctx.room._id,
"cmd": "roomMsg",
}
})
})
})
```