Image: The Matrix
Wechaty Mocker provides the mocking system for testing Wechaty Chatbots.
This is an essential component when you are trying to test your wechaty puppet implementation. This project is aim to provide a tool that helps you mock a wechat account, which could mock an account with mock contacts and mock rooms, and generate messages (in different types), events (like friendship events, room events etc) for you.
Currently there are several wechaty puppets available, like wechaty-puppet-macpro
or wechaty-puppet-padplus
, but we don't know how many instance we could run on a 2 core cpu 4G memory machine, when it came to industry usage of these project, the performance is a key attribute. The reason that we don't know the answer to the question is that we can not evaluate this, there is no test server that we can use since we are trying to connect to Wechat. Thus we need a mock tool to mock these things so we can do some pressure testing on our puppet code, then we will have confidence to say how many wechat accounts could be run on a 2 core cpu 4G memory machine. From that point, we will be able to find a number to optimize.
- Generate wechat account, includes
wxid
,name
,weixin
,avatar
,gender
- Generate contacts and rooms: according to config (contact count, room count, room member distribution)
- Emit messages: according to config (frequency, message types, room message ratio and contact message ratio)
- Emit friendship events: according to config (frequency) emit friendship events
- Emit room events; according to config (frequency of different room events)
import { createFixture } from 'wechaty-mocker'
for await (const { wechaty, mocker } of createFixture()) {
// 1. Log Wechaty messages
wechaty.wechaty.on('message', console.info)
// 2. Make player say something to our bot
mocker.player.say().to(mocker.bot)
// 3. Wait and see. That's it!
await new Promise(setImmediate)
}
Here's a example for testing Vorpal Game: Math Master by Wechaty Mocker.
Math Master is a text game that the bot will ask player to calculate numbers, and the player will get 1 score for each right answer. The game will increase the difficulty by asking bigger numbers, and each round the player must text the right answer in no more than 10 seconds.
In this example, we will use our mocking system to pretend we are a player, to play the game to get a very high score (like 13)!
/**
* Player Logic
*/
const onMessageMock = async (message: mock.MessageMock) => {
if (message.type() !== Message.Type.Text) { return }
const text = message.text()
if (!text) { return }
const MATH_RE = /Score: (\d+).+?(\d+) \+ (\d+) = \?/s
const match = text?.match(MATH_RE)
if (!match) { return }
const score = parseInt(match[1], 10)
if (score > 13) { return }
const x = parseInt(match[2], 10)
const y = parseInt(match[3], 10)
const result = String(x + y)
await new Promise(resolve => setTimeout(resolve, 500))
mocker.player.say(result).to(mocker.bot)
}
mocker.player.on('message', onMessageMock)
The full source code can be found at: examples/math-master.ts
To be written.
Release v1.0 of Wechaty Mocker.
- v0.9 (Sep 15, 2021): ES Modules support
- Add the Math Master Example.
- Support
EnvironmentMock
forcreateFixture(...)
- Move
createFixture
from wechaty andmocker.*
from wechaty-puppet-mock to prevent circler dependencies.
Huan LI (李卓桓), Tencent TVP of Chatbot, <[email protected]>
- Code & Docs © 2020 Huan LI <[email protected]>
- Docs released under Creative Commons
- Code released under the Apache-2.0 License