【发布时间】:2015-12-26 13:12:31
【问题描述】:
我正在尝试通过存根模块的依赖项来对模块进行单元测试,在本例中为 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');
}
);
}
};
};
我正在存根 UserManager 的 saveCode 函数,它返回一个 Promise 以便它返回一个已解决的 Promise,但是当我 assert 时,res.redirect 已被调用,唉,在断言时 @987654327 @ 尚未被调用。
单元测试的简化版本是:
// 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));
})
});
我怎样才能正确地存根 promise 以使被测方法同步运行?
【问题讨论】:
-
你使用什么测试框架?它没有异步支持吗?
-
使用
mocha,是的,它支持异步,但在这种情况下这对我没有帮助。正在测试的不是 Promise,而是对 Promise 的结果做出反应的代码。 -
res未在您的测试代码中定义。如果它是一个真正的函数,您可以在其中调用done(作为测试函数的输入) -
抱歉,你是对的,我忘记在我实际测试的这段摘录中定义
res。为了完整起见,我会修复它。
标签: node.js unit-testing promise stubbing rsvp-promise