Je trouve que la "solution" consistant simplement à augmenter les délais d'attente obscurcit ce qui se passe réellement ici, qui est soit
- Votre code et / ou vos appels réseau sont beaucoup trop lents (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 puisse y donner suite.
Vous rencontrez généralement # 2 lorsque Mocha ne reçoit pas d'erreurs d'assertion d'un rappel. Cela est dû à un autre code avalant l'exception plus haut dans la pile. La bonne façon de résoudre ce problème est de corriger le code et de ne pas avaler l'erreur .
Quand le code externe avale vos erreurs
Dans le cas où il s'agit d'une fonction de bibliothèque que vous ne pouvez pas modifier, vous devez intercepter 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 passez 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);
}
});
});
Ce passe-partout peut bien sûr être extrait dans une fonction d'utilité 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
En dehors de cela, je vous suggère de suivre les conseils pour commencer à utiliser des talons de test pour les appels réseau pour faire passer les tests sans avoir à compter sur un réseau qui fonctionne. 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 les nise
documents de Sinon pour plus d'informations.