2015-09-01 15 views
16

Questo è fondamentalmente un seguito al problema github Remove timeout for single jasmine spec.Timeout infinito del gelsomino

La domanda:

E 'possibile effettuare una sola prova mai timeout?

Il problema:

E 'possibile impostare un valore di timeout globalmente via DEFAULT_TIMEOUT_INTERVAL oppure per ogni descrivere con beforeEach/afterEach o una singola it() blocco:

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

sono interessato in avere una singola specifica mai timeout. Ho cercato di seguire i consigli proposti nel numero github menzionato e utilizzare Infinity:

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

ma, ho ottenuto il seguente errore immediatamente dopo le prove salirono sulla it() blocco:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

Immagino di non poter usare Infinity come valore di timeout, o sto facendo qualcosa di sbagliato.


Come soluzione alternativa, è possibile utilizzare un numero grande con hardcoded, ma vorrei evitarlo.

+0

Per curiosità, qual è il caso d'uso per avere una specifica che non è mai volte su? – finspin

+0

@finspin questa è una buona domanda. Ho un test di lunga durata che può richiedere molto tempo per essere completato. A rigor di termini non può essere infinito e ci sono limiti sane al suo tempo di esecuzione. Ma, in realtà sono curioso di sapere se è possibile avere un timeout infinito. Grazie. E, avendo 'Infinity' come valore di timeout in opposizione a' 1000000' penso che mi farebbe sentire meglio riguardo al codice. – alecxe

risposta

11

Jasmine utilizza internamente setTimeout per attendere che le specifiche finiscano per un periodo di tempo definito.

Secondo questo Q/A - Why does setTimeout() "break" for large millisecond delay values?:

setTimeout using a 32 bit int to store the delay

...

Timeout values too big to fit into a signed 32-bit integer may cause overflow in FF, Safari, and Chrome, resulting in the timeout being scheduled immediately. It makes more sense simply not to schedule these timeouts, since 24.8 days is beyond a reasonable expectation for the browser to stay open.

Appena Infinity è maggiore di qualsiasi altro numero si verifica l'overflow.

Il numero intero sicuro massimo in questo caso è 2 -1 = 2147483647. Questo valore è finito, quindi il test non verrà effettivamente eseguito infinitamente lungo, ma come detto Credo 24,8 giorni sono sufficienti.

È possibile definire una costante per memorizzare questo valore:

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

+0

Grazie ancora per la spiegazione dettagliata! – alecxe

Problemi correlati