Je trouve que la "solution" consistant à augmenter les délais d'attente masque ce qui se passe réellement ici, à savoir que
- Votre code et/ou vos appels réseau sont beaucoup trop lents (ils devraient être inférieurs à 100 ms pour une bonne expérience utilisateur).
- Les assertions (tests) échouent et quelque chose avale les erreurs avant que Mocha ne soit capable d'agir sur elles.
Vous rencontrez généralement le #2 lorsque Mocha ne reçoit pas les erreurs d'assertion d'un callback. Ceci est causé par un autre code qui avale l'exception plus haut dans la pile. La bonne façon de traiter ce problème est de corriger le code et de ne pas avaler l'erreur. .
Quand le code externe avale vos erreurs
S'il s'agit d'une fonction de bibliothèque que vous ne pouvez pas modifier, vous devez attraper l'erreur d'assertion et la transmettre vous-même à Mocha. Pour ce faire, vous devez envelopper votre rappel d'assertion dans un bloc try/catch et transmettre toute exception au gestionnaire d'assertion.
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);
}
});
});
Ce modèle peut bien sûr être extrait dans une fonction utilitaire pour rendre le test un peu plus agréable à l'œil :
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érer les tests de réseau
A part cela, je vous suggère de suivre les conseils pour commencer à utiliser des stubs de test pour les appels réseau afin de faire passer les tests sans avoir à dépendre d'un réseau fonctionnel. En utilisant Mocha, Chai et Sinon, les tests pourraient ressembler à quelque chose comme 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.