Pytanie Nieskończony czas oczekiwania na jaśmin


Jest to zasadniczo kontynuacja Usuń limit czasu dla pojedynczej specyfikacji jaśminu github problem.

Pytanie:

Czy możliwe jest wykonanie jednego testu bez przekroczenia limitu czasu?

Problem:

Możliwe jest ustawienie globalnej wartości limitu czasu poprzez DEFAULT_TIMEOUT_INTERVAL lub dla każdego opisać beforeEach/afterEach lub na singlu it() blok:

it('Has a custom timeout', function() {
  expect(true).toBeTruthy();
}, value in msec)

Interesuje mnie posiadanie pojedynczego speca bez limitu czasu. Starałem się postępować zgodnie z radą zaproponowaną we wspomnianym numerze github i używać Infinity:

it('Has a custom timeout', function() {
  expect(true).toBeTruthy();
}, Infinity)

ale mam następujący błąd natychmiast po zakończeniu testów it() blok:

Błąd: Limit czasu - wywołania asynchroniczne nie zostały wywołane w limicie czasu określonym przez jasmine.DEFAULT_TIMEOUT_INTERVAL

Chyba nie mogę tego użyć Infinity jako wartość limitu czasu lub robię coś nie tak.


Aby obejść ten problem, zamiast tego mogę użyć dużej liczby zakodowanej na stałe, ale chciałbym tego uniknąć.


16
2017-09-01 16:25


pochodzenie


Z ciekawości, jaki jest pożytek z posiadania specyfikacji, która nigdy nie wygasła? - finspin
@finspin to dobre pytanie. Mam długi test, który może zająć dużo czasu. Ściśle mówiąc, nie może być nieskończony i istnieją rozsądne ograniczenia czasu jego realizacji. Ale jestem ciekawy, czy można mieć nieskończony czas oczekiwania. Dzięki. I, mając Infinity jako wartość limitu czasu w przeciwieństwie do 1000000 Myślę, że sprawiłoby, że poczułbym się lepiej z tym kodem. - alecxe


Odpowiedzi:


Jaśmin używa wewnętrznie setTimeout czekać na zakończenie specyfikacji przez określony czas.

Według tego Q / A - Dlaczego funkcja setTimeout () "zrywa" dla dużych opóźnień o wartości milisekund?:

setTimeout przy użyciu 32-bitowego int do przechowywania opóźnienia

...

Wartości limitu czasu zbyt duże, aby zmieściły się w podpisanej 32-bitowej liczbie całkowitej, mogą powodować   przepełnienie w FF, Safari i Chrome, co powoduje, że czas oczekiwania jest   zaplanowane natychmiast. Bardziej sensowne jest po prostu nie planować   te limity czasu, od 24,8 dni, są poza uzasadnionymi oczekiwaniami   przeglądarka pozostaje otwarta.

Jak tylko Infinity jest większa niż jakakolwiek inna liczba. Występuje przepełnienie.

Maksymalną bezpieczną liczbą całkowitą w tym przypadku jest 231-1 = 2147483647. Ta wartość jest skończona, więc test nie będzie faktycznie działać nieskończenie długo, ale jak powiedziałem, myślę, że 24,8 dni to wystarczająco długo.

Możesz zdefiniować stałą do przechowywania tej wartości:

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

});

Zobacz przykładowy plik tutaj


12
2017-09-02 09:03



Jeszcze raz dziękuję za szczegółowe wyjaśnienie! - alecxe