开玩笑未解决的承诺不会失败



>Jest docs 说:

未解决的承诺

如果承诺根本无法解决,则可能会引发此错误:

(等等(

就我而言,这不会发生。 我有这个测试:

test('detect infinite loop', () => {
expect.assertions(1);
const vastPromise = VastUtils.parseFromUrl(infiniteLoopUrl);
const expectedError =
new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
return expect(vastPromise).rejects.toEqual(expectedError); 
});

VastUtils只需获取位于infiniteLoopUrl的 XML,解析它,如果这个 xml 指向另一个 XML,VastUtils点击链接,解析新的 XML,合并它们并重复该过程。 现在,infiniteLoopUrl指向引用自身的 XML,因此它是一个无限循环。 "正确",代码无限地遵循 XML 链接,并且永远不会解析或拒绝承诺。

我希望上述测试在一定超时后失败,但事实并非如此。

有人可以帮助我吗? 谢谢

>编辑: 我正在尝试用一个较小的示例重现一个无限的 Promise 循环,这就是我注意到的:

此测试在 5 秒后正确失败:

test('Promise2', () => {
const genPromise = (): Promise<void> => {
return new Promise((res) => {
setTimeout(() => {
res();
}, 200);
})
.then(() => {
return genPromise();
});
};
const vastPromise = genPromise();
const expectedError =
new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
return expect(vastPromise).rejects.toEqual(expectedError);
});

这个测试在 5 秒后不要失败(开玩笑保持无限循环(

test('Promise', () => {
const genPromise = (prom: Promise<void>): Promise<void> => {
return prom
.then(() => {
return genPromise(Promise.resolve());
});
};
const vastPromise = genPromise(Promise.resolve());
const expectedError =
new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
return expect(vastPromise).rejects.toEqual(expectedError);
});

显然这些是相似的,但我不明白导致开玩笑无限循环的差异......

好的,我已经理解了这个问题。

原因是 js 的单线程性质。 在编辑部分的两个示例中,第一个示例有一个超时,因此有那么一刻,jest 会控制并可以检查超时。 在第二个没有,所以开玩笑永远不要检查超时。

在我的真实案例中,问题是假服务器:它被创建为:

server = sinon.fakeServer.create({
respondImmediately: true
});

立即让 sinon 同步响应,所以开玩笑永远无法控制。 将其创建为:

server = sinon.fakeServer.create({
autoRespond: true
});

Sinon 在 10ms 后响应,开玩笑可以检查时间流逝

相关内容

最新更新