Я считаю, что «решение» просто увеличения тайм-аутов скрывает то, что на самом деле здесь происходит, что либо
- Ваш код и / или сетевые вызовы слишком медленные (должно быть меньше 100 мс для хорошего пользовательского опыта)
- Утверждения (тесты) не выполняются, и что-то проглатывает ошибки, прежде чем Mocha сможет их исправить.
Обычно вы сталкиваетесь с # 2, когда Mocha не получает ошибок подтверждения от обратного вызова. Это вызвано тем, что какой-то другой код поглотил исключение дальше по стеку. Правильный способ справиться с этим - исправить код, а не проглотить ошибку .
Когда внешний код глотает ваши ошибки
В случае, если это библиотечная функция, которую вы не можете изменить, вам нужно отловить ошибку утверждения и передать ее в Mocha самостоятельно. Вы делаете это, оборачивая ваш обратный вызов утверждения в блок try / catch и передавая любые исключения обработчику 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);
}
});
});
Этот шаблон, конечно, может быть извлечен в некоторую функцию полезности, чтобы сделать тест немного более приятным для глаз:
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
Документы Синона для получения дополнительной информации.