无限的茉莉花超时

时间:2015-09-01 16:25:36

标签: javascript testing jasmine protractor

这基本上是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作为超时值,或者我做错了。

作为一种解决方法,我可以使用硬编码的大号,但我想避免这种情况。

1 个答案:

答案 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);

});

See working sample here