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

测试handleShare函数时fetchMock断言失败,请求排查原因

解决handleShare测试中fetchMock断言失败的问题

你遇到的这个断言失败问题,核心是异步操作的时序没有处理好——你的测试代码在调用handleShare后立刻就去检查fetch是否被调用,但handleShare内部的所有逻辑都是基于Promise的异步操作,此时Promise链还没执行到fetch请求那一步,所以fetchMock自然还没被触发,导致断言返回false。

下面是具体的修复步骤:

1. 让handleShare返回Promise链

原函数没有返回内部的Promise链,导致测试代码无法等待异步操作完成。修改handleShare,让它返回整个Promise链:

handleShare(response, payload) {
  // 返回Promise链,方便测试等待
  return ShareUtils.listUsers()
    .then((users) => {
      users.forEach(user => userList.push({ name: user.name, id: user.id }));
      return SessionUtils.getSessionData(SESSION_ID);
    })
    .then((sessionData) => {
      //construct share object
      return fetch('http://myEndpoint', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      })
    })
    .then(r => r.json())
    .then((response) => {
      Logger.log(response)
    })
    .catch((err) => {
      ErrorHandler.error(err)
    });
}

2. 修改测试代码,等待异步操作完成

使用async/await(或者.then())等待handleShare的异步逻辑执行完毕后再进行断言,同时修正fetchMock的匹配规则(原匹配器/myEndpoint/可能和实际请求的http://myEndpoint不匹配):

describe('Share Controller', function() {
  it('should call handleShare correctly', async function() {
    // 初始化stubs
    const listUsersStub = sinon.stub(ShareUtils, 'listUsers').resolves(listOfUsers);
    const sessionDataStub = sinon.stub(SessionUtils, 'getSessionData').resolves(slackSessionData);
    
    // 配置fetchMock,匹配完整的请求URL和参数
    fetchMock.mock('http://myEndpoint', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      response: 'ok'
    });

    // 等待handleShare的所有异步操作完成
    await ShareController.handleShare({}, payload);

    // 执行断言
    expect(fetchMock.called()).to.be.true;
    // 可选:验证fetch调用的细节
    expect(fetchMock.calledWith('http://myEndpoint', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    })).to.be.true;

    // 恢复stubs,避免影响其他测试用例
    listUsersStub.restore();
    sessionDataStub.restore();
    fetchMock.restore();
  });
});

3. 额外检查点

  • 确保userList在测试用例中是干净的状态(比如每次测试前重置),避免残留数据影响Promise链的执行
  • 如果你的fetchMock版本需要更严格的匹配,可以检查是否需要指定请求体(原代码里你注释了//construct share object,如果实际有请求体,也要在fetchMock中匹配)

这样修改后,测试会等待handleShare内部的所有异步步骤完成,再去验证fetch是否被调用,就能解决断言失败的问题了。

内容的提问来源于stack exchange,提问作者Bhuwan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:28:20