Я пытаюсь выполнить модульное тестирование модуля, отключив одну из его зависимостей, в данном случае UserManager
Упрощенная версия модуля выглядит следующим образом:
// CodeHandler
module.exports = function(UserManager) {
return {
oAuthCallback: function(req, res) {
var incomingCode = req.query.code;
var clientKey = req.query.key;
UserManager.saveCode(clientKey, incomingCode)
.then(function(){
res.redirect('https://test.tes');
}).catch(function(err){
res.redirect('back');
}
);
}
};
};
Я заглушаю функцию saveCode
UserManager, которая возвращает Promise
, так что она возвращает разрешенное обещание, но когда я assert
вызывал res.redirect
, увы, во время утверждения res.redirect
еще не вызывался.
Упрощенная версия модульного теста:
// test
describe('CodeHandler', function() {
var req = {
query: {
code: 'test-code',
key: 'test-state'
}
};
var res = {
redirect: function() {}
};
var expectedUrl = 'https://test.tes';
var ch;
beforeEach(function() {
sinon.stub(UserManager, 'saveCode').returns(
new RSVP.Promise(function(resolve, reject){
resolve();
})
);
sinon.stub(res, 'redirect');
ch = CodeHandler(UserManager);
});
afterEach(function() {
UserManager.saveCode.restore();
res.redirect.restore();
});
it('redirects to the expected URL', function(){
ch.oAuthCallback(req, res);
assert(res.redirect.calledWith(expectedUrl));
})
});
Как я могу правильно заглушить промис, чтобы тестируемый метод работал синхронно?
mocha
и да, у него есть асинхронная поддержка, но в данном случае это мне не поможет. Тестируется не обещание, а код, реагирующий на результат обещания. - person Dave Sag   schedule 29.09.2015res
не определено в вашем тестовом коде. если бы это была реальная функция, вы могли бы вызватьdone
внутри нее (которую вы получаете в качестве входных данных для своей тестовой функции) - person Amit   schedule 29.09.2015res
в этом отрывке из моего фактического теста. Я исправлю это для полноты картины. - person Dave Sag   schedule 30.09.2015