Я вважаю, що "рішення" просто збільшити тайм-аути затьмарює те, що відбувається насправді, що є
- Ваш код та / або мережеві дзвінки занадто повільні (для хорошої роботи з користувачем має бути менше 100 мс)
- Твердження (тести) провалюються, і щось проковтне помилки, перш ніж Моха зможе їх діяти.
Ви, як правило, стикаєтеся з №2, коли Mocha не отримує помилок твердження від зворотного дзвінка. Це викликано деяким іншим ковтанням коду, що виключає подальше стек. Правильний спосіб вирішити це - виправити код і не проковтнути помилку .
Коли зовнішній код проковтує ваші помилки
У випадку, якщо це функція бібліотеки, яку ви не можете змінити, вам потрібно зафіксувати помилку твердження і самостійно передати її на Mocha. Ви робите це, обертаючи зворотний виклик твердження в блок "try / catch" і передайте будь-які винятки готовому оброблювачу.
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);
}
});
});
Звичайно, ця котловарна плита може бути використана в якійсь корисній функції, щоб зробити тест трохи приємнішим для очей:
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);
}
}
Прискорення мережевих тестів
Крім цього, я пропоную вам підібрати поради щодо початку використання тестових заглушок для мережевих дзвінків, щоб тести проходили, не покладаючись на функціонуючу мережу. Використання Mocha, Chai та Sinon тестів може виглядати приблизно так
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;
});
});
Докладнішу інформацію див. У nise
документах Сінона .