web-dev-qa-db-fra.com

Dans les tests mocha lors de l'appel de la fonction asynchrone, comment éviter le délai d'attente Erreur: dépassement du délai d'attente de 2000 ms

Dans mon application de nœud, j'utilise mocha pour tester mon code. Lors de l'appel de nombreuses fonctions asynchrones à l'aide de mocha, une erreur de temporisation (Error: timeout of 2000ms exceeded.) est générée. Comment puis-je résoudre ça?

var module = require('../lib/myModule');
var should = require('chai').should();

describe('Testing Module', function() {

    it('Save Data', function(done) {

        this.timeout(15000);

        var data = {
            a: 'aa',
            b: 'bb'
        };

        module.save(data, function(err, res) {
            should.not.exist(err);
            done();
        });

    });


    it('Get Data By Id', function(done) {

        var id = "28ca9";

        module.get(id, function(err, res) {

            console.log(res);
            should.not.exist(err);
            done();
        });

    });

});
185
sachin

Vous pouvez soit définir le délai d'attente lors de l'exécution de votre test:

mocha --timeout 15000

Ou vous pouvez définir le délai d’expiration pour chaque suite ou chaque test par programme:

describe('...', function(){
  this.timeout(15000);

  it('...', function(done){
    this.timeout(15000);
    setTimeout(done, 15000);
  });
});

Pour plus d'informations, voir le docs .

332
Andreas Hultgren

Je trouve que la "solution" d'augmenter simplement les délais d'attente masque ce qui se passe réellement ici, à savoir

  1. Votre code et/ou les appels réseau sont trop lents (moins de 100 ms pour une bonne expérience utilisateur)
  2. Les assertions (tests) échouent et quelque chose avale les erreurs avant que Mocha ne puisse les traiter.

Vous rencontrez généralement # 2 lorsque Mocha ne reçoit pas d'erreurs d'assertion d'un rappel. Ceci est dû à un autre code avalant l'exception plus haut dans la pile. La bonne façon de traiter ceci est de corriger le code et de ne pas avaler l'erreur .

Lorsque du code externe engloutit vos erreurs

Si vous ne pouvez pas modifier une fonction de bibliothèque, vous devez détecter l'erreur d'assertion et la transmettre vous-même à Mocha. Pour ce faire, vous encapsulez votre rappel d'assertion dans un bloc try/catch et transmettez toutes les exceptions au gestionnaire done.

it('should not fail', function (done) { // Pass reference here!

  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});

Bien entendu, ce passe-partout peut être extrait dans une fonction utilitaire pour rendre le test un peu plus agréable à l'oeil:

it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});

// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try { 
        fn();
        done();
    } catch (error) {
        done(error);
    }
}

Accélération des tests réseau

Autre que cela, je vous suggère de prendre le conseil sur commencer à utiliser des talons de test pour les appels réseau pour faire passer les tests sans avoir à compter sur un réseau en fonctionnement. En utilisant Mocha, Chai et Sinon, les tests pourraient ressembler à ceci

describe('api tests normally involving network calls', function() {

    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];

        this.xhr.onCreate = function (xhr) {
            requests.Push(xhr);
        };
    },

    afterEach: function () {
        this.xhr.restore();
    }


    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);

        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });

});

Voir Sinon nise docs pour plus d'informations.

79
oligofren

Un peu tard, mais quelqu'un pourra l'utiliser à l'avenir ... Vous pouvez augmenter la durée de votre test en mettant à jour les scripts de votre package.json avec les éléments suivants:

"scripts": { "test": "test --timeout 10000" //Adjust to a value you need }

Exécutez vos tests en utilisant la commande test

7
Daniel Mbeyah

Pour moi, le problème était en fait la fonction de description, qui, lorsqu'elle est fournie avec une fonction de flèche, fait que mocha manque le délai d'attente et se comporte de manière incohérente. (Utilisation de ES6)

étant donné qu'aucune promesse n'a été rejetée, je recevais tout le temps cette erreur pour différents tests échouant à l'intérieur du bloc describe

alors voici à quoi ça ressemble quand il ne fonctionne pas correctement:

describe('test', () => { 
 assert(...)
})

et cela fonctionne en utilisant la fonction anonyme

describe('test', function() { 
 assert(...)
})

J'espère que cela aidera quelqu'un, ma configuration pour ce qui précède: (nodejs: 8.4.0, npm: 5.3.0, mocha: 3.3.0)

1
syberkitten

Mon problème ne renvoyait pas la réponse, il était donc suspendu. Si vous utilisez express, assurez-vous que res.send (data), res.json (data) ou la méthode api que vous voulez utiliser est exécuté pour la route que vous testez.

0
il0v3d0g