我有以下代码(为缩小问题范围而简化):
function pushPromises() {
const promises = [];
promises.push(firstPromise('something'))
promises.push(secondPromise('somethingelse'))
return promises;
}
export default handlePromises(async (c) => {
const results = await Promise.all(pushPromises())
c.success(results);
});
我的测试模拟了firstPromise和secondPromise,以检查是否使用正确的参数调用了它们。这可行(假设模拟设置正确完成):
jest.mock('src/firstPromise');
jest.mock('src/secondPromise');
describe('test', () => {
let firstMock;
let secondMock;
beforeEach(() => {
require('src/firstPromise').default = firstMock;
require('src/secondPromise').default = secondMock;
})
it('test', async () => {
await handlePromises(context);
expect(firstPromiseMock).toHaveBeenCalledTimes(1);
expect(secondPromiseMock).toHaveBeenCalledTimes(1);
});
});
现在,如果我向承诺中添加处理程序,例如:
function pushPromises() {
const promises = [];
promises.push(
firstPromise('something')
.then(r => console.log(r))
.catch(e => console.log(e))
)
promises.push(
secondPromise('somethingelse')
.then(r => console.log(r))
.catch(e => console.log(e))
)
return promises;
}
第一个期望通过,但第二个没有通过。似乎第二个诺言不再被称为。
如何修改测试/代码,以使在promise上添加处理程序不会导致测试中断?看起来它只是在第一个promise处理程序上完成执行,而从未执行到第二个promise处理程序。
编辑:
我修改了该函数以不等待就返回Promise.all:
export default handlePromises(async (c) => {
return Promise.all(pushPromises())
});
但是我遇到了完全相同的问题。如果第一个承诺具有.then
,则不会调用第二个承诺。
答案 0 :(得分:0)
您的handlePromises函数接受回调,但是您正在处理它,因为它返回了一个Promise,这不是一个好方法,但是您可以按照以下方法使用回调来测试您的方法
将测试修改为=>
it('test', (done) => {
handlePromises(context);
context.success = (results) => {
console.log(results)
expect(firstPromiseMock).toHaveBeenCalledTimes(1);
expect(secondPromiseMock).toHaveBeenCalledTimes(1);
done();
}
});
或将代码修改为=>
function pushPromises() {
const promises = [];
promises.push(firstPromise('something'))
promises.push(secondPromise('somethingelse'))
return promises;
}
export default handlePromises = (context) => {
return Promise.all(pushPromises()).then((data) => context.success(data))
};
//with async
export default handlePromises = async (context) => {
let data = await Promise.all(pushPromises());
context.success(data)
};