Бесконечный тайм-аут жасмина

Это в основном продолжение Удалить тайм-аут для одной спецификации жасмина github issue.

Вопрос:

Можно ли сделать один тест без тайм-аута?

Проблема:

Можно установить значение тайм-аута глобально через 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():

Ошибка: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL

Я думаю, я не могу использовать Infinity как значение тайм-аута, или я делаю что-то неправильно.


В качестве обходного пути я могу использовать большое количество жестких дисков, но я хотел бы избежать этого.

Ответы

Ответ 1

Жасмин внутренне использует setTimeout, чтобы дождаться завершения спецификации в течение определенного периода времени.

В соответствии с этим Q/A - Почему setTimeout() "break" для больших значений миллисекундной задержки?:

setTimeout с использованием 32-битного int для хранения задержки

...

Значения таймаута, слишком большие, чтобы вписаться в 32-битное целое число, могут вызывать переполнение в FF, Safari и Chrome, в результате чего таймаут запланировано немедленно. Это имеет смысл просто не планировать эти таймауты, поскольку 24,8 дня выходят за рамки разумных ожиданий браузер останется открытым.

Как только Infinity больше любого другого числа, происходит переполнение.

Максимальное безопасное целое число в этом случае равно 2 31 -1 = 2147483647. Это значение конечно, поэтому тест на самом деле не будет выполняться бесконечно долго, но, как я сказал, 24 часа в сутки достаточно.

Вы можете определить константу для сохранения этого значения:

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

});

См. рабочий пример здесь