You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:12:14