存根回调函数,不要 return 承诺
stub a function with callback, don't return promise
我有一个正在调用函数的服务,我正在为该服务编写测试,我需要在该服务中存根该函数,该函数具有回调而不是 return 承诺。当我为此创建存根并提供虚拟 return 但它挂起,因为服务需要回调,
这是我的测试代码
describe('Testing Token Service', () => {
let _stub =null;
beforeEach(async()=>{
_stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
if(_stub){
_stub.restore()
}
})
it('testing function saveToken_mongo() ', (done) => {
_stub.returns(Promise.resolve( {'status' : 'true'} ))
token_service.saveToken_mongo({},function(err, data){
console.log(err, data)
done();
})
// done()
}); });
这是我正在为其编写测试的服务功能
Service.prototype.saveToken_mongo = function(token, callback){
var _token = new tModel( token ) ;
_token.save(function(err, data){
if(err){
callback(err, null);
return ;
}
else{
callback(null, {'status':true})
return ;
}
}) }
我需要使用存根从该函数进行虚拟回调 return。
有点棘手,你的回调是saveToken_mongo参数,
没有测试但尝试:
_stub.returns(function(err, data){callback(null, {'status':true}) });
如果您收到回调错误,请告诉我,您可以尝试使用 this.callback
而不是
stub.returns
用于普通函数,不用于回调。由于save
是回调函数,我们可以使用yields
。
_stub.yields(null, {'status' : 'true'});
第一个参数是错误值,第二个参数是数据。
作为参考:
https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
经过研究,我得出结论,这个问题有2种解法。
1) 根据 deerawan 的说法,我们可以使用 yields 来代替函数的回调,就像这样
_stub.yields(null, {'status' : 'true'});
了解更多详情https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
2) 使用 bluebird 来 promisify 所有方法,这会将所有方法响应从回调更改为 promise 然后你可以使用 Promise.returns,这里是代码
var Model = conn.model( name , ModelSchema);
var Promise = require('bluebird');
Promise.promisifyAll(Model);
Promise.promisifyAll(Model.prototype);
module.exports = Model;
现在可以使用测试如下
let _stub = null;
var tModel = require('./../app/models/tokens') ;
beforeEach(async()=>{
_stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
if(_stub){
_stub.restore()
}
})
it('returns a Promise' ,async function(){
_stub.returns(Promise.resolve( {'status' : 'true & false'} ));
expect(token_service.saveToken_mongo({})).to.be.a("Promise")
})
我有一个正在调用函数的服务,我正在为该服务编写测试,我需要在该服务中存根该函数,该函数具有回调而不是 return 承诺。当我为此创建存根并提供虚拟 return 但它挂起,因为服务需要回调, 这是我的测试代码
describe('Testing Token Service', () => {
let _stub =null;
beforeEach(async()=>{
_stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
if(_stub){
_stub.restore()
}
})
it('testing function saveToken_mongo() ', (done) => {
_stub.returns(Promise.resolve( {'status' : 'true'} ))
token_service.saveToken_mongo({},function(err, data){
console.log(err, data)
done();
})
// done()
}); });
这是我正在为其编写测试的服务功能
Service.prototype.saveToken_mongo = function(token, callback){
var _token = new tModel( token ) ;
_token.save(function(err, data){
if(err){
callback(err, null);
return ;
}
else{
callback(null, {'status':true})
return ;
}
}) }
我需要使用存根从该函数进行虚拟回调 return。
有点棘手,你的回调是saveToken_mongo参数,
没有测试但尝试:
_stub.returns(function(err, data){callback(null, {'status':true}) });
如果您收到回调错误,请告诉我,您可以尝试使用 this.callback
而不是
stub.returns
用于普通函数,不用于回调。由于save
是回调函数,我们可以使用yields
。
_stub.yields(null, {'status' : 'true'});
第一个参数是错误值,第二个参数是数据。
作为参考:
https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
经过研究,我得出结论,这个问题有2种解法。
1) 根据 deerawan 的说法,我们可以使用 yields 来代替函数的回调,就像这样
_stub.yields(null, {'status' : 'true'});
了解更多详情https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
2) 使用 bluebird 来 promisify 所有方法,这会将所有方法响应从回调更改为 promise 然后你可以使用 Promise.returns,这里是代码
var Model = conn.model( name , ModelSchema);
var Promise = require('bluebird');
Promise.promisifyAll(Model);
Promise.promisifyAll(Model.prototype);
module.exports = Model;
现在可以使用测试如下
let _stub = null;
var tModel = require('./../app/models/tokens') ;
beforeEach(async()=>{
_stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
if(_stub){
_stub.restore()
}
})
it('returns a Promise' ,async function(){
_stub.returns(Promise.resolve( {'status' : 'true & false'} ));
expect(token_service.saveToken_mongo({})).to.be.a("Promise")
})