Я считаю, что «решение» просто увеличивая время ожидания затемняет то, что происходит на самом деле здесь, что либо
- Ваш код и/или сетевые вызовы являются слишком медленно (должно быть суб 100 мс хороший пользовательский опыт)
- Утверждения (тесты) терпят неудачу, и что-то поглощает ошибки, прежде чем Моча сможет действовать на них.
Обычно вы сталкиваетесь с №2, когда 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);
}
}
Ускорение сетевых тестов
Другие, чем Я предлагаю вам подобрать совет, чтобы начать использовать тестовые заглушки для сетевых вызовов, чтобы пройти тесты без необходимости полагаться на функционирующую сеть. Использование Мокко, 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;
});
});
Смотрите Sinon's nise
docs для получения дополнительной информации.
Это тест интеграции? для запуска теста достаточно времени - возможно, вам стоит подумать о заглушках - https://github.com/thlorenz/proxyquire может вам помочь. – surui
@surui спасибо, я посмотрю на это – sachin
Могу ли я порекомендовать использовать обещания для асинхронного материала и тестировать его, тогда это легкий ветерок с [Чей как обещание] (https://www.npmjs.com/package/chai-as-promised) – Krym