【发布时间】:2019-08-16 16:18:52
【问题描述】:
我有以下代码(为了缩小问题范围而进行了简化):
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);
});
});
现在,如果我向 Promise 添加处理程序,例如:
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())
});
但我遇到了完全相同的问题。如果第一个 promise 有 .then,则不会调用第二个 promise。
【问题讨论】:
-
这些模拟是如何设置的?
-
await handlePromises(context);handlePromises 对我来说不像是一个承诺,所以 await 不会有任何效果。 -
handlePromises(context) 这里 context 必须有一个名为 success 的回调,然后你必须将你的期望语句移动到成功回调中。
-
您有两种非常不同的方式调用
handlePromises。在您的真实代码中,您使用异步函数调用它并导出它的结果,很可能是一个承诺。在您的测试代码中,您使用上下文调用它,这很可能是一个对象。 -
添加了模拟设置@raina77ow
标签: javascript promise mocking jestjs