Estoy codificando un bot de Discord y quiero probar un código. Con la biblioteca discord.js, tenemos que usar un cliente para conectarnos a la API de Discord. Al principio el cliente recibe un evento cuando está listo:
En mi index.js
client.on('ready', () => {})Pero en mi prueba necesito información (un gremio) proveniente del caché del cliente:
beforeAll(() => { client.on('ready', () => { // => guild that I need for test guildToTest = client.guilds.cache.get('912785389704609832'); }); }); describe('setCounterForRoles testing', () => { test('Unit test', async () => { // => Here guildToTest is null const guilds = await setCounterForRoles(guildToTest); }); }); Necesito el gremio para la prueba, pero esta prueba se procesa antes de que llegue el evento ready , por lo que el guild es null .
¿Cómo puedo asegurarme de que el evento ready se active antes de ejecutar las pruebas?
Leí algunas cosas en los documentos sobre jest.spyOn() pero no sé si es la solución.
Si desea ejecutar pruebas en un servidor Discord en vivo, puede conectarse al servidor Discord y obtener el gremio dentro beforeAll() . Su problema es que client.on es asincrónico, por lo que debe decirle a Jest que está conectado al servidor y obtuvo el gremio.
Si la función pasada a beforeAll() devuelve una promesa, Jest espera a que se resuelva esa promesa antes de ejecutar las pruebas. Por lo tanto, puede devolver una promesa aquí y resolverla dentro de su función de devolución de llamada.
Además, asegúrese de terminar la conexión a Discord usando el método destroy() dentro afterAll() . Si no hace esto, Jest se quejará de que "no salió un segundo después de que se completó la prueba" .
let guildID = '912785389704609832'; let guild; beforeAll(() => { return new Promise((resolve) => { client.on('ready', async () => { guild = await client.guilds.fetch(guildID); resolve(); }); }); }); afterAll(() => { client.destroy(); }); describe('Connect to Discord', () => { test('get the guild by its ID', async () => { expect(guild.id).toBe(guildID); }); });