Skip to main content
Nivel: Avanzado · Etiquetas: Testing, Vitest, Transcripciones doradas, Flujos Funcionalidades: Testing (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 proyecto:

El bot que se prueba

El archivo de tests completo

Ejecútalo:
La primera ejecución pasa y escribe 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 de tests/golden/pedido.json tras la primera ejecución:

Transcripción de ejemplo

El mismo bot a mano, capturado con npx 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