这基本上是Remove timeout for single jasmine spec github问题的后续行动。
问题:
是否可以使单个测试永不超时?
问题:
可以通过DEFAULT_TIMEOUT_INTERVAL
全局设置超时值,或者使用beforeEach
/ afterEach
或单个it()
块设置每个描述:
it('Has a custom timeout', function() {
expect(true).toBeTruthy();
}, value in msec)
我对单个规格永不超时感兴趣。我已尝试按照上述github问题中提出的建议并使用Infinity
:
it('Has a custom timeout', function() {
expect(true).toBeTruthy();
}, Infinity)
但是,在测试进入it()
区块后,我立即收到以下错误:
错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调
我想我不能使用Infinity
作为超时值,或者我做错了。
作为一种解决方法,我可以使用硬编码的大号,但我想避免这种情况。
答案 0 :(得分:15)
Jasmine在内部使用setTimeout
等待规范在指定的时间段内完成。
根据此Q / A - Why does setTimeout() "break" for large millisecond delay values?:
setTimeout使用32位int来存储延迟
...
超时值太大而不适合签名的32位整数可能会导致 在FF,Safari和Chrome中溢出,导致超时 立即安排。更简单的是不安排 这些超时,因为24.8天超出了合理的预期 浏览器保持开放状态。
只要Infinity
大于任何其他数字,就会发生溢出。
在这种情况下,最大安全整数是2 31 -1 = 2147483647.这个值是有限的,所以测试实际上不会无限长地运行,但正如我所说的那样24.8天很长足够。
您可以定义一个常量来存储此值:
jasmine.DEFAULT_TIMEOUT_INTERVAL = 2000;
var MAX_SAFE_TIMEOUT = Math.pow(2, 31) - 1;
describe('suite', function () {
it('should work infinitely long', function (done) {
setTimeout(function () {
expect(true).toBe(true);
done();
}, 3000)
}, MAX_SAFE_TIMEOUT);
});