Переосмысление с помощью nodejs и expresso
Я пытаюсь использовать rethinkdb
и проверить это через expresso
, У меня есть функция
module.exports.setup = function() {
var deferred = Q.defer();
r.connect({host: dbConfig.host, port: dbConfig.port }, function (err, connection) {
if (err) return deferred.reject(err);
else deferred.resolve();
});
return deferred.promise;
});
Я проверяю это так
module.exports = {
'setup()': function() {
console.log("in setup rethink");
db.setup().then(function(){
console.log(clc.green("Sucsessfully connected to db!"));
}).catch(function(err){
console.log('error');
assert.isNotNull(err, "error");
});
}
};
И я бегу код, как это
expresso db.test.js
Но экспресс-шоу error 100% 1 tests
даже в случае ошибки. Я пытался поставить throw err;
в catch
, но ничего не меняется.
Но если я поставлю assert.eql(1, 2, "error");
в начале setup()
это терпит неудачу как ожидалось;
Есть ли что-то, что кеширует ошибки? Как я могу заставить его потерпеть неудачу, как это должно быть? За squalize
я нашел
Sequelize.Promise.onPossiblyUnhandledRejection(function(e, promise) {
throw e;
});
Есть ли что-то подобное для переосмысления БД?
1 ответ
Проблема в том, что этот тест является асинхронным, и вы рассматриваете его как синхронный тест. Вам нужно сделать следующее:
module.exports = {
'setup()': function(beforeExit, assert) {
var success;
db.setup().then(function(){
success = true;
}).catch(function(err){
success = false;
assert.isNotNull(err, "error");
});
beforeExit(function() {
assert.isNotNull(undefined, 'Ensure it has waited for the callback');
});
}
};
Мокко против Экспресс
Вы должны рассмотреть mocha.js, который имеет гораздо более приятный API для асинхронных операций, передавая done
функция. Тот же тест будет выглядеть так:
module.exports = {
'setup()': function(done) {
db.setup().then(function(){
assert.ok(true);
}).catch(function(err){
assert.isNotNull(err, "error");
})
.then(function () {
done();
});
}
};
обещания
Первую написанную вами функцию можно переписать следующим образом, поскольку драйвер RethinkDB по умолчанию возвращает обещание для всех операций.
module.exports.setup = function() {
return r.connect({host: dbConfig.host, port: dbConfig.port });
});