我有一个正在调用函数的服务,我正在为该服务编写测试,并且需要在该服务中添加该函数的功能,该函数具有回调功能而不是返回承诺。当我为此创建存根并提供虚拟返回但由于服务期望回调而挂起时, 这是我的测试代码
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 ;
}
}) }
我需要使用存根从该函数返回虚拟回调。
答案 0 :(得分:0)
这有点棘手,您的回调是saveToken_mongo参数,
没有测试,但尝试:
_stub.returns(function(err, data){callback(null, {'status':true}) });
如果您在回调中遇到错误,请告诉我,您可以尝试使用this.callback
代替
答案 1 :(得分:0)
.facebookbutton{
background:#2e39a4;
用于普通函数,而不用于回调。由于stub.returns
是回调函数,因此我们可以使用save
。
yields
第一个参数用于错误值,第二个参数用于数据。
作为参考:
https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
答案 2 :(得分:0)
研究之后,我得出结论,该问题有两种解决方案。
1)根据deerawan,我们可以使用yield代替函数的回调,例如
_stub.yields(null, {'status' : 'true'});
了解更多信息https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-
2)使用bluebird分配所有方法,这将改变回调中所有方法的响应以承诺,然后可以使用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")
})