测试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
相关产品推荐
相关产品推荐

