如何用Jest为DiscordJS的getSpecificGuild编写Fetch/Catch测试
解决Jest测试DiscordJS getSpecificGuild函数时的catch属性报错问题
问题根源
报错TypeError: Cannot read property 'catch' of undefined,核心原因是:
getSpecificGuild函数在获取失败的分支中没有返回Promise,导致测试代码里链式调用.catch()时找不到对应的属性- 测试代码对异步函数的调用方式不符合Jest的异步测试规范
修复步骤
第一步:确保getSpecificGuild始终返回Promise
先检查你的函数实现,必须保证无论成功或失败,都返回一个Promise对象。示例实现如下:
// 用async/await写法(推荐) async function getSpecificGuild(client, guildId) { try { const guild = await client.guilds.fetch(guildId); return guild; } catch (err) { console.error('获取Guild失败:', err); return false; } } // 或者用Promise链式写法 function getSpecificGuild(client, guildId) { return client.guilds.fetch(guildId) .then(guild => guild) .catch(err => { console.error('获取Guild失败:', err); return false; }); }
关键:绝对不能在失败分支直接返回false,必须让函数始终返回Promise(async函数默认会把返回值包装成Promise)
第二步:修正Jest测试代码
测试异步函数时,优先使用Jest的async/await语法,避免错误的链式调用。正确测试示例:
const getSpecificGuild = require('../utils/guildUtils'); // 模拟Discord Client对象 const mockClient = { guilds: { fetch: jest.fn() } }; describe('getSpecificGuild 函数测试', () => { test('成功获取Guild对象', async () => { // 模拟fetch成功返回Guild const mockGuild = { id: '12345', name: '测试服务器' }; mockClient.guilds.fetch.mockResolvedValue(mockGuild); const result = await getSpecificGuild(mockClient, '12345'); expect(result).toEqual(mockGuild); expect(mockClient.guilds.fetch).toHaveBeenCalledWith('12345'); }); test('获取失败返回false', async () => { // 模拟fetch抛出错误 mockClient.guilds.fetch.mockRejectedValue(new Error('Guild不存在')); const result = await getSpecificGuild(mockClient, '67890'); expect(result).toBe(false); expect(mockClient.guilds.fetch).toHaveBeenCalledWith('67890'); }); });
常见错误排查
- 如果你的测试代码里写了
getSpecificGuild(...).catch(...),但函数没返回Promise,就会触发该错误,换成async/await写法更稳妥 - 确保
client.guilds.fetch的模拟逻辑正确:失败场景必须用mockRejectedValue模拟抛出错误,而非直接返回undefined - 检查函数内部所有分支,避免出现直接返回非Promise值的情况(比如某些条件分支里直接
return false)
内容的提问来源于stack exchange,提问作者Cif
相关产品推荐
相关产品推荐

