使用 Sinon 在 Promise 和 return a Resolve() 中存根代码
Using Sinon to stub code inside a Promise and return a Resolve()
最后一天我一直坚持这个问题,我决定需要帮助。我有以下 javascript class 方法,我正在为其编写单元测试:
getUser = function(req, res){
return new Promise(function(resolve, reject){
User.getByUserId(user_id, function(err, user){
if (err){
return reject({ message: defaultErrorMessage })
} else {
return user ? resolve() : reject({ message: 'The specified user does not exist.' })
}
})
}).then(function(){
....Promise Chain Continues...
})
本质上,我想做的是编写一个单元测试,用以下代码来消除 User.getByUserId mongoose 调用:
let resolvedPromise = sinon.stub().resolves();
sinon.stub(User,'getByUserId').returns(resolvedPromise);
我的想法是我想删除找到用户的数据库调用和 return 已解决的承诺,以便承诺链可以继续,但是我当前的解决方案不允许承诺链继续。
我如何在 promise 中有一个 sinon 存根并让那个存根 return 一个允许 promise 链继续的 resolve() ?帮助将不胜感激!
User.getByUserId
是一个带有回调的函数。我们不能为此使用 returns
of sinon.stub
。解决方案是使用 yields
sinon.stub(User, 'getByUserId').yields(null, userObj);
参考:
https://sinonjs.org/releases/v7.2.2/stubs/#stubyieldsarg1-arg2-
更新
yields
和 returns
之间的区别可以用下面的例子来描述:
// User.js
/** function with ordinary return **/
function getUser() {
return { name: 'admin', sex: 'male' };
}
/** function with callback and no return **/
function getUserById(id, callbackFunc) {
callbackFunc();
}
/** function that return promise **/
function getUserBySex(sex) {
return getFromDb(); // getFromDb() is a promise function
}
对于测试文件中的 sinon 存根
// test.js
// use `returns` for function with ordinary return
sinon.stub(User, 'getUser').returns({ name: 'whatever', sex: 'female' });
// use `yields` or `callArgsWith` for function that has callback function
sinon.stub(User, 'getUserById').yields(null, userObj);
sinon.stub(User, 'getByUserId').callsArgWith(1, null, userObj); // 1 => second parameter
// use `resolves` for function that returns promise
sinon.stub(User, 'getUserBySex').resolves(userObj);
更多参考资料:
最后一天我一直坚持这个问题,我决定需要帮助。我有以下 javascript class 方法,我正在为其编写单元测试:
getUser = function(req, res){
return new Promise(function(resolve, reject){
User.getByUserId(user_id, function(err, user){
if (err){
return reject({ message: defaultErrorMessage })
} else {
return user ? resolve() : reject({ message: 'The specified user does not exist.' })
}
})
}).then(function(){
....Promise Chain Continues...
})
本质上,我想做的是编写一个单元测试,用以下代码来消除 User.getByUserId mongoose 调用:
let resolvedPromise = sinon.stub().resolves();
sinon.stub(User,'getByUserId').returns(resolvedPromise);
我的想法是我想删除找到用户的数据库调用和 return 已解决的承诺,以便承诺链可以继续,但是我当前的解决方案不允许承诺链继续。
我如何在 promise 中有一个 sinon 存根并让那个存根 return 一个允许 promise 链继续的 resolve() ?帮助将不胜感激!
User.getByUserId
是一个带有回调的函数。我们不能为此使用 returns
of sinon.stub
。解决方案是使用 yields
sinon.stub(User, 'getByUserId').yields(null, userObj);
参考:
https://sinonjs.org/releases/v7.2.2/stubs/#stubyieldsarg1-arg2-
更新
yields
和 returns
之间的区别可以用下面的例子来描述:
// User.js
/** function with ordinary return **/
function getUser() {
return { name: 'admin', sex: 'male' };
}
/** function with callback and no return **/
function getUserById(id, callbackFunc) {
callbackFunc();
}
/** function that return promise **/
function getUserBySex(sex) {
return getFromDb(); // getFromDb() is a promise function
}
对于测试文件中的 sinon 存根
// test.js
// use `returns` for function with ordinary return
sinon.stub(User, 'getUser').returns({ name: 'whatever', sex: 'female' });
// use `yields` or `callArgsWith` for function that has callback function
sinon.stub(User, 'getUserById').yields(null, userObj);
sinon.stub(User, 'getByUserId').callsArgWith(1, null, userObj); // 1 => second parameter
// use `resolves` for function that returns promise
sinon.stub(User, 'getUserBySex').resolves(userObj);
更多参考资料: