createTestBot, MockProvider, expectReply, expectNoReply) ·
Transcripciones doradas (redactTranscript, serializeTranscript, assertTranscript) ·
Flujos (.ask con validate, .timeout) ·
Comandos slash ·
Simulador en la terminal (defineBot)
Requisitos previos
Node.js 22.12 o superior y un proyecto ESM ("type": "module"), como en
Inicio rápido.
El bot que se prueba
El archivo de tests completo
tests/golden/pedido.json. Commitea ese
archivo: a partir de ahí el último test lo reproduce contra createBot en
cada ejecución.
Cómo funciona
1. Una función de setup, dos puntos de entrada
setupBot(bot) registra todo sobre el Bot que reciba. La fábrica
(createBot) la envuelve para npx botmesh dev y node bot.js, y los tests
la llaman sobre el bot que construye createTestBot(). Los tests y el bot
real nunca se separan.
2. Conversaciones con createTestBot
createTestBot({ lang: 'es' }) arranca un Bot sobre un MockProvider: sin
teléfono ni red. chat.send() es un mensaje del usuario;
chat.expectReply() espera una respuesta que contenga el texto (o cumpla una
RegExp) y falla con un TestKitError legible que lista lo que el bot sí
envió. chat.expectNoReply() comprueba que el bot se queda callado. Para cada
bot en afterEach, así ningún temporizador sobrevive al test.
3. Grabar la transcripción dorada
chat.transcript() devuelve el intercambio en el formato de transcripción
dorada. redactTranscript() cambia ids y nombres visibles por marcadores
(<user:1>, <name:1>), y también los teléfonos o emails que escribió el
usuario, así que el archivo se puede commitear. serializeTranscript()
escribe JSON estable y fácil de comparar. Pon UPDATE_GOLDEN=1 para volver a
grabarla después de un cambio intencionado.
4. Los comandos ganan
/cancel viene de slashCommandsPlugin. Los comandos siempre ganan a una
conversación activa, así que el usuario siempre puede salir de un flujo; el
test comprueba que el flujo terminó de verdad porque 2 llega al catch-all.
5. Reproducirla
assertTranscript(golden, createBot) construye un bot nuevo con la fábrica,
reproduce cada turno de entrada y compara cada respuesta. Una respuesta
cambiada, ausente o de más lanza un TranscriptMismatchError con un informe
de esperado frente a obtenido. Para respuestas que cambian en cada ejecución
(fechas, ids), pasa máscaras:
assertTranscript(golden, createBot, { masks: [REPLAY_MASKS.isoDate] }).
El archivo dorado
El comienzo detests/golden/pedido.json tras la primera ejecución:
Transcripción de ejemplo
El mismo bot a mano, capturado connpx botmesh dev bot.js:
Ejecutarlo en WhatsApp o Telegram
node bot.js se conecta a WhatsApp: escanea el QR con el teléfono que hará de
bot. Para Telegram, instala @botmesh/telegram y pasa
new TelegramProvider({ token: process.env.TELEGRAM_TOKEN }) a createBot.
Los tests no cambian: nunca tocan un canal real.
Siguientes pasos
- Testing: varios usuarios y grupos, matchers de Vitest y el kit de caos
- Transcripciones doradas: grabar desde producción, reglas de redacción y opciones de reproducción
- Crear un plugin: un plugin que puedes cubrir con las mismas herramientas