我很难编写测试来断言在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 ...
问题是您在不返回await
的函数上使用Promise
。请注意,doSomething
不是async
,并且不会返回Promise
对象。