在forEach循环中声明catch代码块>>

问题描述 投票:0回答:1

我很难编写测试来断言在forEach循环内执行的catch块内发生的事情。

产品代码

function doSomething(givenResourceMap) {
  givenResourceMap.forEach(async (resourceUrl) => {
    try {
        await axios.delete(resourceUrl);
    } catch (error) {
        logger.error(`Error on deleting resource ${resourceUrl}`);
        logger.error(error);
        throw error;
    }
});

我想断言logger.error被两次调用,并且每次都用正确的参数调用。所以我写了这样的测试]

describe('Do Something', () => {
  it('should log message if fail to delete the resource', function() {        
    const resource1Url = chance.url();
    const givenResourceMap = new Map();
    const thrownError = new Error('Failed to delete');
    givenResourceMap.set(resource1Url);

    sinon.stub(logger, 'error');
    sinon.stub(axios, 'delete').withArgs(resource1Url).rejects(thrownError);

    await doSomething(givenResourceMap);

    expect(logger.error).to.have.callCount(2);
    expect(logger.error.getCall(0).args[0]).to.equal(`Error deleting resource ${resource1Url}`);
    expect(logger.error.getCall(1).args[0]).to.equal(thrownError);
    // Also need to know how to assert about `throw error;` line
  });
});

我正在使用正宗的摩卡咖啡,期待测试。上面的测试失败,表明logger.error为0倍。

谢谢。

我很难编写测试来断言在catch块内发生的事情,该块在forEach循环内执行。产品代码函数doSomething(givenResourceMap){namedResourceMap.forEach(async ...

javascript foreach try-catch sinon sinon-chai
1个回答
0
投票

问题是您在不返回await的函数上使用Promise。请注意,doSomething不是async,并且不会返回Promise对象。

© www.soinside.com 2019 - 2024. All rights reserved.