开玩笑:等待事件处理测试
Jest : waiting for an event to process test
我正在编写一个 Discord 机器人,我想测试一些代码。使用 discord.js 库,我们必须使用客户端连接到 Discord API。开始时客户端在准备就绪时收到一个事件:
在我的index.js
client.on('ready', () => {})
但在我的测试中,我需要来自客户端缓存的信息(公会):
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);
});
});
我需要公会进行测试,但此测试是在事件 ready
到来之前处理的,因此 guild
是 null
。
如何确保 ready
事件在 运行 测试之前触发?
我在 jest.spyOn()
上的文档中阅读了一些内容,但我不知道这是否是解决方案。
如果您想 运行 在实时 Discord 服务器上进行测试,您可以连接到 Discord 服务器并在 beforeAll()
中获取公会。您的问题是 client.on
是异步的,因此您需要告诉 Jest 您已连接到服务器并获得公会。
如果传递给 beforeAll()
return 的函数是一个承诺,Jest 会在 运行 测试之前等待该承诺解决。因此,您可以在此处 return 承诺并在回调函数中解决它。
此外,请确保使用 afterAll()
中的 destroy()
方法终止与 Discord 的连接。如果你不这样做,Jest 会抱怨它 “在测试 运行 完成后一秒钟没有退出”.
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);
});
});
我正在编写一个 Discord 机器人,我想测试一些代码。使用 discord.js 库,我们必须使用客户端连接到 Discord API。开始时客户端在准备就绪时收到一个事件:
在我的index.js
client.on('ready', () => {})
但在我的测试中,我需要来自客户端缓存的信息(公会):
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);
});
});
我需要公会进行测试,但此测试是在事件 ready
到来之前处理的,因此 guild
是 null
。
如何确保 ready
事件在 运行 测试之前触发?
我在 jest.spyOn()
上的文档中阅读了一些内容,但我不知道这是否是解决方案。
如果您想 运行 在实时 Discord 服务器上进行测试,您可以连接到 Discord 服务器并在 beforeAll()
中获取公会。您的问题是 client.on
是异步的,因此您需要告诉 Jest 您已连接到服务器并获得公会。
如果传递给 beforeAll()
return 的函数是一个承诺,Jest 会在 运行 测试之前等待该承诺解决。因此,您可以在此处 return 承诺并在回调函数中解决它。
此外,请确保使用 afterAll()
中的 destroy()
方法终止与 Discord 的连接。如果你不这样做,Jest 会抱怨它 “在测试 运行 完成后一秒钟没有退出”.
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);
});
});