我正试图用Jest测试promises-chain序列:
someChainPromisesMethod: function() {
async()
.then(async1)
.then(async2)
.then(result)
.catch(error);
}
虽然测试单一承诺是好的记录,但不确定什么是正确的方法(不知道该怎么做TBO)来测试这种链。让我们假设所有的asyncs都被嘲笑,只是在他们的身体里解决了Promise.resolve。
所以我需要能够测试整个序列的东西。
答案 0 :(得分:8)
您可以使用jest.fn()来模拟实现并检查调用函数的内容并返回您想要的内容。您需要模拟函数中的所有async
函数并返回所需的函数。
e.g。
async = jest.fn(() => {
return Promise.resolve('value');
});
async1 = jest.fn(() => {
return Promise.resolve('value1');
});
async2 = jest.fn(() => {
return Promise.resolve('Final Value');
});
您可以在测试中使用它
it('should your test scenario', (done) => {
someChainPromisesMethod()
.then(data => {
expect(async1).toBeCalledWith('value');
expect(async2).toBeCalledWith('value1');
expect(data).toEqual('Final Value');
done();
});
});
但是,如果你有自己的逻辑,我会压扁你的链并单独测试它们,这样你就可以轻松测试所有可能性。
答案 1 :(得分:2)
使用done不能解决问题,它会给你一个误报测试。如果出于任何原因期望失败,您的测试将会超时并且您将无法获得实际结果。
正确的解决方案是返回您的Promise,因此Jest将能够正确评估期望结果。
遵循@grgmo示例,更好的方法可能是:
it('should your test scenario', () => {
return someChainPromisesMethod()
.then(data => {
expect(async1).toBeCalledWith('value');
expect(async2).toBeCalledWith('value1');
expect(data).toEqual('Final Value');
});
});