Pourquoi un Discord en mémoire
Un test a besoin d’un Discord contre lequel tourner, et le vrai s’y prête mal : il lui faut un token, un serveur, des gens qui cliquent, et il montre chaque essai à tout le monde. Alorschapterjs test joue Discord lui-même : un serveur qui vit en mémoire, avec un salon #general, un propriétaire, le bot en admin, et les personnes que vous nommez. Vos fichiers tournent exactement comme ils le feraient en ligne, contre le même framework ; seul l’autre bout est joué. Rien à quoi se connecter, rien à configurer, et ça tourne en une seconde.
Lancez-le
chapterjs dev le ferait :
/dice doit répondre, seulement qu’elle doit répondre sans casser. La plupart des bugs sont attrapés là. Ce que vos fichiers impriment pendant ce temps (le console.log de heartbeat, par exemple) reste hors du rapport, et s’affiche sous une vérification qui a échoué.
Un scénario
Pour ce que le bot doit dire, vous écrivez un scénario : un fichier qui finit en.test.ts, n’importe où dans src/, que le bot ne charge jamais. Créez src/commands/dice.test.ts :
src/commands/dice.test.ts
Ligne par ligne
scenario('…', async bot => { … })est un test : un libellé, affiché dans le rapport, et une fonction. Un fichier peut en exporter plusieurs, dans une liste.botest votre bot dans son serveur de test.bot.use(dice, { sides: 20 })utilise/dicecomme une personne le ferait : les options sont typées depuis le fichier, doncsidesdoit être un nombre entier etwhoune personne. Survolez-les, votre éditeur sait.- Ce qui revient est la réponse.
says('a fait')vérifie que le texte le contient,isPublic()que tout le monde le voit,hasButton('Relancer')que le bouton est là. Chaque vérification lance une phrase en clair quand elle échoue, et renvoie la réponse sinon, pour enchaîner. bot.click(reply.button('Relancer'), { on: reply })appuie sur le bouton de cette réponse.updatesMessage()vérifie que le bot a changé le message au lieu d’en envoyer un nouveau : c’est ce que faitinteraction.update().bot.member('alice')est une personne du serveur, créée la première fois que le nom est donné. Son nom affiché estAlice, ce que/whoismontre.
Quand ça échoue
Changez le scénario pour attendre'a fait un' et relancez :
chapterjs dev signale une erreur dans une commande. Un scénario échoue aussi quand une fonction du bot lance une erreur pendant qu’il tourne, même si chaque vérification est passée : une personne aurait vu « Something went wrong », et ce n’est jamais ce que vous voulez.
Points d’attention
- Qui fait les choses. Quand personne n’est nommé, c’est
bot.someone: une personne sans droit particulier. Une commande avec despermissionsla refuse, comme Discord le ferait. Nommez quelqu’un avec ce qu’il lui faut :bot.member('mod', { permissions: ['ModerateMembers'] }), puis{ by: mod }en dernier argument. - Ce que Discord refuserait est refusé avant le bot. Une option obligatoire omise, un nombre hors de sa plage, un texte trop long : le scénario échoue avec la raison, parce que l’application Discord n’aurait jamais envoyé cela.
- Le serveur garde ce que le bot a fait.
bot.channel('general').lastest le message le plus récent là-bas,member.banneddit si quelqu’un a été banni,member.timedOuts’il est exclu temporairement,channel.threadsliste les fils. Pour tout le reste,node:assertfonctionne comme dans n’importe quel test. - Le temps ne passe pas. Un
cooldown, ou une tâche qui tourneeveryheure, ne se teste pas en attendant.bot.run(task)lance une tâche maintenant, comme si son heure était venue. - Tout n’est pas encore là. Le vocal, les sondages et les événements planifiés ne sont pas simulés : un événement que le serveur ne sait pas provoquer est nommé dans le rapport avec
ℹ, et le reste est vérifié.
Récapitulatif
chapterjs testfait tourner votre bot contre un Discord en mémoire : pas de token, pas de serveur, personne qui regarde.- Sans une ligne écrite, chaque commande, composant, événement et tâche est utilisé une fois avec des valeurs ordinaires et difficiles, et doit répondre sans lancer d’erreur.
- Un scénario est
scenario('libellé', async bot => { … })dans un fichier*.test.tsdesrc/:bot.use(),bot.click(),bot.say(),bot.join()…, et la réponse dit ce que le bot a fait. - Un échec nomme le fichier et la ligne, comme toute autre erreur.
Compiler
Vérifier tout le bot et le compiler pour la production.
Guide : Tester
La même chose, en court, avec tout ce qu’un scénario peut faire.