- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
在账户 A 中,我使用 cloudformation 创建了一个 s3 存储桶,CodeBuild 构建了一个工件并上传到该存储桶。在账户 B 中,我尝试使用 cloudformation 创建堆栈,
我是一名优秀的程序员,十分优秀!