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();
});
});
});
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 .
Je trouve que la "solution" d'augmenter simplement les délais d'attente masque ce qui se passe réellement ici, à savoir
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.
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
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)
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.