В настоящее время я использую mocha 2.5.3, supertest 2.0.0, knex 0.11.10, restify 4.1.1 и sqlite3 3.1.4.
У меня есть следующий очень простой сервер восстановления:
const restify = require('restify');
const knex = require('knex')({
client: 'sqlite3',
connection: {
'filename': 'test.db'
}
});
const app = restify.createServer();
app.get('/', (req, res, next) => {
knex.select().from('nonexistent_table')
.then((rows) => {
return res.json(rows);
})
.catch((err) => {
return res.send('error');
});
});
module.exports = app;
Приведенный ниже тест приведет к тайм-ауту теста в 2000 мс, а не к сбою:
const assert = require('assert');
const supertest = require('supertest');
const app = require('./app');
describe('GET /', function () {
it('should not timeout', function (done) {
supertest(app)
.get('/')
.end(function(err, res) {
assert(false);
done();
});
});
});
Если вызов knex выполнен, а не отклонен, тест завершается правильно и не истечет время ожидания. Тайм-аут появляется только в том случае, если вызов knex отклонен.
У кого-нибудь есть мысли о том, что может быть причиной тайм-аута вместо правильного сбоя?
РЕДАКТИРОВАТЬ: я отлаживал это, насколько мог, и кажется, что тайм-аут происходит, когда мокко пытается создать трассировку стека.
done
никогда не вызывается и ошибка никогда не ловится. - person robertklep   schedule 25.08.2016assert(false)
в тесте, то режим отказа вообще не должен зависеть от ответа от restify сервера или результата от knex, но как-то так! Во-вторых, если я напишу мокко-тест, который не выполняет асинхронный http-вызов, а просто выдает ошибку, тест законно провалится, а не истечет время ожидания, хотя я никогда не вызываюdone()
. Это наводит меня на мысль, что генерация ошибок/неудачных утверждений — это нормальный способ, при котором тесты мокко терпят неудачу. - person   schedule 25.08.2016