Come si modifica il timeout su una specifica asincrona jasmine-node


90

Come posso far passare questo test senza ricorrere a blocchi run / waitsFor?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});

Risposte:


105

Puoi (ora) impostarlo direttamente nelle specifiche, come da documentazione di Jasmine .

describe("long asynchronous specs", function() {

    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });
});

Sì, cambiare jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;valore ha fatto il trucco per me su una nuova configurazione costruita da zero usando Jasmine + Jest. Funziona come previsto.
Ignacio Segura

Sono d'accordo @willydee, ho avuto problemi a eseguire test con cloudinary e questo piccolo frammento è venuto in mio soccorso.
Dev Yego

1
Vale la pena notare forse che questo deve accadere prima del it. Nel momento in cui sei nel test, donesembra che si sia già agganciato a ciò che DEFAULT_TIMEOUT_INTERVALera prima dell'inizio it.
ruffin

79

Richiesta pull inviata per questa funzione ( https://github.com/mhevery/jasmine-node/pull/142 )

it("cannot change timeout", function(done) {

  request("http://localhost:3000/hello", function(error, response, body){

     expect(body).toEqual("hello world");

     done();
  });

}, 5000); // set timeout to 5 seconds

43

Per impostare il timeout globale Jasmine-Node, procedi come segue:

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

Ringraziamo lo sviluppatore Gabe Hicks per aver scoperto la parte .getEnv () tramite il debug nonostante la disinformazione nel documento README che afferma che è stato fatto impostando jasmine.DEFAULT_TIMEOUT_INTERVAL.

Se vuoi impostare un timeout personalizzato solo per uno it (), potresti provare a passare il timeout (millisecondi) come terzo argomento (dopo l'istruzione stringa e la funzione). C'è un esempio di ciò che viene fatto qui , ma non sono sicuro di cosa accadrebbe se il timeout personalizzato fosse più lungo di quello predefinito di Jasmine. Mi aspetto che fallisca.


28
Aggiornamento per chiunque si imbattesse in questa risposta nel 2014: per Jasmine 2 l'impostazione di jasmine.DEFAULT_TIMEOUT_INTERVAL funziona.
Simon Groenewolt

2
Per me funziona su una nuova configurazione utilizzando Jest + Jasmine. Ho appena aggiunto jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;un file di configurazione globale che uso per tutti i test e funziona come previsto.
Ignacio Segura

23

Sembra che ora puoi aggiungerlo come ultimo argomento per la itfunzione:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});

11

In Angular, metti questo al di fuori del tuo blocco di descrizione:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Questo vale per tutti i test nel file .spec.ts


3

Mettilo dopo la describedichiarazione:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

2

Aggiunta: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;su un file di supporto ha funzionato per me.


1

Perché non spiando setTimeout()?

Qualcosa di simile a:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();

1
Grazie. Questi sono test di integrazione, node.js chiama un servizio esterno che è spesso lento.
Brian Low

questo è geniale, rende possibile testare il timeout senza far aspettare il test per il timeout effettivo
Guillaume

in questo modo non esercitiamo il passare del tempo e chiamiamo subito fn, mentre l'originale non lo chiama mai prima del ciclo successivo.
André Werlang

0

Nel mio caso ho avuto più casi di test e mentre stavo usando la soluzione di cui sopra con stavo usando:

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

DEFAULT_TIMEOUT_INTERVAL non è stato aggiornato al primo caso di test, quindi ho dovuto aggiungere questo:

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

al mio codice per eseguire correttamente tutti i test.


-17

Cambia j $ .DEFAULT_TIMEOUT_INTERVAL in 10000 nel seguente file: npm \ node_modules \ jasmine-core \ lib \ jasmine-core


Non fruttuoso per gli scenari in cui le librerie vengono installate ogni volta che viene eseguito il test. Es: - esecuzione di CI su Cloud.
domino_katrino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.