存根回调函数,不要 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")   
})