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

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

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

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.


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

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


3

Mettez-le après la describedéclaration:

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

2

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


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

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.


-17

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.