gpt4 book ai didi

testing - Jest 悬而未决的 promise 不会落空

转载 作者:行者123 更新时间:2023-11-28 20:36:28 28 4
gpt4 key购买 nike

Jest 文档说:

Unresolved Promises

If a promise doesn't resolve at all, this error might be thrown:

(等等)

在我的例子中,这不会发生。我有这个测试:

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 。

我预计上述测试会在特定超时后失败,但事实并非如此。

有人可以帮助我吗?谢谢


编辑:我正在尝试用一个较小的示例重现无限 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 秒后不会失败(开 Jest 保持在无限循环中)

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);
});

显然这些是相似的,但我不明白导致 Jest 无限循环的区别......

最佳答案

好的,我明白了这个问题。

原因是js的单线程性质。在编辑部分的两个示例中,第一个有超时,所以有一段时间可以控制并检查超时。在第二个中没有,所对于Jest永远不要检查超时。

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

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

respondImmediately 让 sinon 同步响应,所以 jest 永远没有控制权。将其创建为:

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

sinon 在 10ms 后响应,jest 可以检查时间流逝

关于testing - Jest 悬而未决的 promise 不会落空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52512949/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com