Comment modifier le délai d'expiration sur une spécification asynchrone jasmine-node

90

Comment puis-je faire réussir ce test sans recourir aux blocs runs / waitsFor?

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

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

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

         done();
     });
});
Brian Low
la source

Réponses:

105

Vous pouvez (maintenant) le définir directement dans la spécification, conformément à la documentation 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;
    });
});
Francisco
la source
Ouais, changer de jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;valeur a fait l'affaire pour moi sur une toute nouvelle configuration construite à partir de zéro en utilisant Jasmine + Jest. Cela fonctionne comme prévu.
Ignacio Segura
Je suis d'accord @willydee, j'ai eu des problèmes lors de l'exécution de tests avec cloudinary et ce petit extrait est venu à ma rescousse.
Dev Yego
1
Il convient de noter peut-être que cela doit se produire avant le it. Au moment où vous êtes dans le test, donesemble avoir déjà accroché à tout ce qui DEFAULT_TIMEOUT_INTERVALétait avant de itcommencer.
ruffin
79

Demande d'extraction envoyée pour cette fonctionnalité ( 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
Brian Low
la source
43

Pour définir le délai d'expiration global Jasmine-Node, procédez comme suit:

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

Nous remercions le développeur Gabe Hicks pour avoir compris la partie .getEnv () via le débogage malgré la désinformation dans le document README qui prétend que c'est fait en définissant jasmine.DEFAULT_TIMEOUT_INTERVAL.

Si vous souhaitez définir un délai d'expiration personnalisé uniquement pour un it (), vous pouvez essayer de passer le délai d'expiration (millisecondes) comme troisième argument (après l'instruction de chaîne et la fonction). Il y a un exemple de cela fait ici , mais je ne suis pas sûr de ce qui se passerait si le délai d'expiration personnalisé était plus long que la valeur par défaut de Jasmine. Je pense que cela échouerait.

Colin May
la source
28
Mise à jour pour quiconque tombe sur cette réponse en 2014: Pour Jasmine 2, le paramètre jasmine.DEFAULT_TIMEOUT_INTERVAL fonctionne.
Simon Groenewolt
2
Cela fonctionne pour moi sur une toute nouvelle configuration utilisant Jest + Jasmine. Je viens d'ajouter jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;un fichier de configuration globale que j'utilise pour tous les tests et cela fonctionne comme prévu.
Ignacio Segura le
23

On dirait que vous pouvez maintenant l'ajouter comme dernier argument de la itfonction:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});
d -_- b
la source
11

Dans Angular, mettez ceci en dehors de votre bloc describe:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Cela s'applique à tous les tests du fichier .spec.ts

danday74
la source
3

Mettez-le après la describedéclaration:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Michał Kuliński
la source
2

Ajout: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;sur un fichier d'aide a fonctionné pour moi.

Ivan Rangel
la source
1

Pourquoi pas en espionnant setTimeout()?

Quelque chose comme:

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

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();
ggozad
la source
1
Merci. Ce sont des tests d'intégration, node.js fait appel à un service externe souvent lent.
Brian Low
c'est génial, cela permet de tester le timeout sans faire attendre le test pour le timeout réel
Guillaume
de cette façon, nous n'exerçons pas le passage du temps et n'appelons pas le fn tout de suite, alors que l'original ne l'appelle jamais avant le cycle suivant.
André Werlang
0

Dans mon cas, j'ai eu plusieurs cas de tests et pendant que j'utilisais la solution susmentionnée, j'utilisais:

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

le DEFAULT_TIMEOUT_INTERVAL n'a pas été mis à jour lors du premier cas de test, j'ai donc dû ajouter ceci:

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

à mon code pour exécuter avec succès tous les tests.

Andreas Foteas
la source
-17

Remplacez j $ .DEFAULT_TIMEOUT_INTERVAL par 10000 dans le fichier suivant: npm \ node_modules \ jasmine-core \ lib \ jasmine-core

sharaj rewoo
la source
Pas utile pour les scénarios où les bibliothèques sont installées à chaque fois que le test est exécuté. Ex: - exécuter CI sur Cloud.
domino_katrino