对带有回调的函数进行存根,不返回promise

时间:2019-02-14 07:53:02

标签: node.js unit-testing testing mocha stub

我有一个正在调用函数的服务,我正在为该服务编写测试,并且需要在该服务中添加该函数的功能,该函数具有回调功能而不是返回承诺。当我为此创建存根并提供虚拟返回但由于服务期望回调而挂起时, 这是我的测试代码

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 ;
    }  
}) }

我需要使用存根从该函数返回虚拟回调。

3 个答案:

答案 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")   
})